检测SQL语句是否正确

时间:2014-05-30 15:36:48

标签: sql sql-server tsql validation

问题:有没有办法检测SQL语句在语法上是否正确?

解释

我有一个非常复杂的应用程序,在某些时候,需要针对不同情况进行非常具体(和不同)的处理。

解决方案是有一个表,其中有每个条件的记录,以及要执行的SQL命令。

普通用户无法访问该表,只有系统管理员才能在新特殊情况发生时定义这些情况。到目前为止,新记录直接添加到表中。 但是,有时会出现拼写错误,并且SQL格式错误,导致问题。

我想要完成的是创建一个用于管理该模块的UI,在哪里让管理员键入SQL命令,并在保存之前对其进行验证。

我的想法是简单地在throw块中运行语句然后捕获结果(异常,如果有的话),但我想知道有一种更不引人注目的方法。

有关此验证的任何建议吗?

由于

PS。我在这里意识到SQL注入的风险,但事实并非如此 - 有权访问它的人受到严格控制,他们是DBA或开发人员 - 因此这里注入SQL的风险是与访问企业管理器的风险相同

2 个答案:

答案 0 :(得分:3)

您可以在查询顶部使用SET PARSEONLY ON。请记住,这只会检查查询是否在语法上是正确的,并且不会捕获拼写错误的表,权限不足等内容。

答案 1 :(得分:0)

查看page here,您可以修改存储过程以获取参数:

CREATE PROC TestValid @stmt NVARCHAR(MAX)
AS 
BEGIN 

IF EXISTS ( 
SELECT 1 FROM sys.dm_exec_describe_first_result_set(@stmt, NULL, 0) 
WHERE error_message IS NOT NULL 
AND error_number IS NOT NULL 
AND error_severity IS NOT NULL 
AND error_state IS NOT NULL 
AND error_type IS NOT NULL 
AND error_type_desc IS NOT NULL ) 

BEGIN 

SELECT error_message  
FROM sys.dm_exec_describe_first_result_set(@stmt, NULL, 0) 
WHERE column_ordinal = 0 

END 
END
GO

如果存在错误,则返回错误,否则返回错误。