sp_executesql 不验证查询字符串

sp_executesql does not validate the query string

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

执行此查询一切顺利:

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,table不存在但是EXEC sp_executesql @script ;执行没有任何错误。

当我尝试使用这个存储过程时,出现错误:

Msg 208, Level 16, State 1, Procedure GetALL, Line 5
Invalid object name 'dbo.alabla'.

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

看这里:How to precompile stored procedures in SQL server?

sp_recompile只会标记一个方法在下次调用时重新编译...

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

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

这应该强制立即编译...

再看看

  • DBCC CHECKDB
  • DBCC FREEPROCCACHE
  • DBCC PROCCACHE

顺便说一句:如果您只想读取数据,我不会使用 SP。您上面的示例非常适合内联 (single-statement, ad-hoc) TVF...