使用EXPLAIN命令验证CREATE TABLE DDL的语法

dev*_*v ツ 5 sql-server oracle db2 teradata netezza

我有一些创建表脚本,我需要在我的应用程序中预先验证.我可以想到两种方式:

  1. 使用该脚本创建表并立即使用DROP表.
  2. 使用EXPLAIN命令查找语法错误而不创建它.

我发现第二种方式更有效率.因此,我使用Explain命令验证了CREATE TABLE DDL.

工作:

Teradata数据

Explain <CREATE TABLE DDL>
Run Code Online (Sandbox Code Playgroud)

神谕

EXPLAIN PLAN FOR <CREATE TABLE DDL>
Run Code Online (Sandbox Code Playgroud)

不工作:

SQL SERVER

找不到存储过程'解释'.SQLState:S00062 ErrorCode:2812

Netezza公司

^找到"CREATE"(在char 18)期望DELETE' orINSERT'或SELECT' orUPDATE'或'WITH'

DB2

错误:DB2 SQL错误:SQLCODE = -104,SQLSTATE = 42601,SQLERRMC = TABLE; EXPLAIN CREATE; JOIN,DRIVER = 4.14.111 SQLState:42601 ErrorCode:-104


  • 还有其他更好的方法来验证Create Table DDL吗?

  • 有没有通用的方法来处理流行的RDBMS?

  • 如果说明是唯一可用的解决方案,那么如何为SQL Server,Netezza和DB2执行解释?

编辑:

这里验证意味着检查语法(存储大小,精度,范围违规,保留关键字作为表或列名称等)

例如,查询像 -

create table abc (c1 decimal(555,44))
Run Code Online (Sandbox Code Playgroud)

我想事先得到精度溢出错误.

Vla*_*nov 3

没有适用于所有 DBMS 的通用/标准方法。

我希望所有流行的 DBMS 都有类似于EXPLAIN命令的东西。返回执行计划而不是运行查询本身。每个服务器都有自己的处理方式。

http://use-the-index-luke.com/sql/explain-plan展示了如何对少数 DBMS 执行此操作。搜索<your DBMS name> explain plan command通常会给出良好的结果。


另一种方法是启动事务、运行语句并回滚事务。当然,您需要有适当的错误处理,这在服务器之间又有所不同。在 SQL Server 中有TRY ... CATCH.

还值得检查所选 DBMS 是否支持事务中的 DDL 语句。例如,在MySQL中,“某些语句无法回滚。一般来说,这些语句包括数据定义语言 (DDL) 语句,例如创建或删除数据库的语句,创建、删除或更改表或存储例程的语句。”