sp_executesql不验证查询字符串



今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不更改它,使用内联查询,

通过执行以下查询,一切都很顺利:

DECLARE @script AS NVARCHAR(MAX)
SET @script = 'ALTER PROCEDURE GetALL
               with recompile
               AS
               BEGIN
                   SELECT *  
                   FROM dbo.Main
                   INNER JOIN dbo.alabla ON dbo.Main.ID = dbo.ATTENDANCE.EMPLOYEE_ID
               END'
EXEC sp_executesql @script ;

上述查询存在语法错误alabla,该表不存在,但EXEC sp_executesql @script ;执行时没有任何错误。

当我尝试使用这个存储过程时,我得到了一个错误:

消息208,级别16,状态1,过程GetALL,第5行
对象名称"dbo.alabla"无效。

这里有人能告诉我们如何确保内联查询执行的安全吗?

看看这里:如何在SQL server中预编译存储过程?

sp_recompile只会在下次调用时标记要重新编译的方法。。。

如果您新创建的过程不操作数据(上面的示例),您可以立即调用它。。。

最好的提示可能是查看SET FMTONLY,即使它已被弃用(https://msdn.microsoft.com/de-de/library/ms173839(v=sql.120).aspx),或者您可以使用sp_describe_first_result_set(以及相关的:请参阅上面提到的页面上的链接)。

这应该会迫使立即进行汇编。。。

此外,请查看

  • DBCC检查数据库
  • DBCC FREEPROCCACHE
  • DBCC进程缓存

btw:如果你只想读取数据,我不会使用SP。上面的例子将是一个可内联(单语句,特别)TVF的完美候选者。。。

相关内容

  • 没有找到相关文章

最新更新