dev*_*v ツ 5 sql-server oracle db2 teradata netezza
我有一些创建表脚本,我需要在我的应用程序中预先验证.我可以想到两种方式:
我发现第二种方式更有效率.因此,我使用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)
我想事先得到精度溢出错误.
没有适用于所有 DBMS 的通用/标准方法。
我希望所有流行的 DBMS 都有类似于EXPLAIN命令的东西。返回执行计划而不是运行查询本身。每个服务器都有自己的处理方式。
http://use-the-index-luke.com/sql/explain-plan展示了如何对少数 DBMS 执行此操作。搜索<your DBMS name> explain plan command通常会给出良好的结果。
EXPLAIN PLAN FORSET PLANONLY ONEXPLAINEXPLAIN PLAN FOREXPLAINSET SHOWPLAN_ALL ONEXPLAINEXPLAIN VERBOSE另一种方法是启动事务、运行语句并回滚事务。当然,您需要有适当的错误处理,这在服务器之间又有所不同。在 SQL Server 中有TRY ... CATCH.
还值得检查所选 DBMS 是否支持事务中的 DDL 语句。例如,在MySQL中,“某些语句无法回滚。一般来说,这些语句包括数据定义语言 (DDL) 语句,例如创建或删除数据库的语句,创建、删除或更改表或存储例程的语句。”