问题:有没有办法检测SQL语句在语法上是否正确?
解释
我有一个非常复杂的应用程序,在某些时候,需要针对不同情况进行非常具体(和不同)的处理。
解决方案是有一个表,其中有每个条件的记录,以及要执行的SQL命令。
普通用户无法访问该表,只有系统管理员才能在新特殊情况发生时定义这些情况。到目前为止,新记录直接添加到表中。 但是,有时会出现拼写错误,并且SQL格式错误,导致问题。
我想要完成的是创建一个用于管理该模块的UI,在哪里让管理员键入SQL命令,并在保存之前对其进行验证。
我的想法是简单地在throw块中运行语句然后捕获结果(异常,如果有的话),但我想知道有一种更不引人注目的方法。
有关此验证的任何建议吗?
由于
PS。我在这里意识到SQL注入的风险,但事实并非如此 - 有权访问它的人受到严格控制,他们是DBA或开发人员 - 因此这里注入SQL的风险是与访问企业管理器的风险相同
答案 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
如果存在错误,则返回错误,否则返回错误。