您应该能够使用仅格式选项
SET FMTONLY ON
在 SQL Server 中评估查询的正确性。设置此选项后,SQL Server 实际上不会尝试创建表格。使用您的示例,T-SQL 将如下所示:
SET FMTONLY ON
create table abc (c1 decimal(555,44))
SET FMTONLY OFF
执行上述T-SQL将返回错误消息“列或参数#1:指定的列精度555大于最大精度38。”
您还可以创建一个存储过程,使用在您正在使用的数据库平台上效果最佳的方法来评估查询。我不熟悉Netezza、Teradata和DB2,但我假设它们可以执行动态SQL。使用此方法,您只需将要评估的查询作为参数从应用程序层传递给存储过程即可。
以下代码片段显示了如何在SQL Server中完成此操作:
CREATE PROCEDURE ValidateQuerySyntax
(
@query NVARCHAR(MAX)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @validationQuery NVARCHAR(MAX) = 'SET FMTONLY ON; ' + CHAR(13) + @query + ';' + CHAR(13) + 'SET FMTONLY OFF;';
BEGIN TRY
EXEC (@validationQuery);
SELECT
0 AS ErrorNumber
,0 AS ErrorSeverity
,0 AS ErrorState
,0 AS ErrorLine
,'Query evaluated successfully' AS ErrorMessage;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
END
查询可以按以下方式进行评估:
DECLARE @query_1 NVARCHAR(MAX) =
'CREATE TABLE A
(
c1 INT
)';
DECLARE @query_2 NVARCHAR(MAX) =
'CREATE TABLE B
(
c1 INT
c2 INT
)';
DECLARE @query_3 NVARCHAR(MAX) =
'CREATE TABLE B
(
c1 INT
,c2 DECIMAL(555,44)
)';
EXEC dbo.ValidateQuerySyntax @query = @query_1;
EXEC dbo.ValidateQuerySyntax @query = @query_2;
EXEC dbo.ValidateQuerySyntax @query = @query_3;
以上验证调用的输出如下:
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ErrorNumber | ErrorSeverity | ErrorState | ErrorLine | ErrorMessage
-------------------------------------------------------------------------------------------------------------------------------------------------------------
0 | 0 | 0 | 0 | Query evaluated successfully
-------------------------------------------------------------------------------------------------------------------------------------------------------------
102 | 15 | 1 | 4 | Incorrect syntax near 'c2'.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
2750 | 16 | 1 | 1 | Column or parameter #2: Specified column precision 555 is greater than the maximum precision of 38.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
当然,这意味着首先需要创建评估查询的存储过程,但它应该简化在不同数据库平台上验证查询的过程。
create table abc (c1 decimal(555,44))
。 - Dev