您应该能够使用仅格式选项SET FMTONLY ON 在 SQL Server 中评估查询的正确性。使用此选项集,SQL Server 将不会实际尝试创建表。使用您的示例,T-SQL 将如下所示:
SET FMTONLY ON
create table abc (c1 decimal(555,44))
SET FMTONLY OFF
执行上述T-SQL会返回错误信息'Column or parameter #1: Specified column precision 555 is greater than the maximum precision of 38.'
您还可以创建一个存储过程,使用在您使用的数据库平台上效果最好的方法为您评估查询。我不熟悉 Netezza、Teradata 和 DB2,但我假设它们可以执行动态 SQL。使用此方法,您只需将要评估的查询作为参数从应用程序层传递给存储过程。
以下代码 sn-p 显示了如何为 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);
-- Return error code 0 if query validation was successful.
SELECT
0 AS ErrorNumber
,0 AS ErrorSeverity
,0 AS ErrorState
,0 AS ErrorLine
,'Query evaluated successfully' AS ErrorMessage;
END TRY
BEGIN CATCH
-- Return error information if query validation failed.
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.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
当然,这确实意味着创建存储过程来首先为您评估查询,但它应该简化跨不同数据库平台的查询验证。