sp_executesql不验证查询字符串

时间:2016-01-08 11:33:18

标签: sql-server tsql stored-procedures 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 ;执行时没有任何错误。

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

  

Msg 208,Level 16,State 1,Procedure GetALL,Line 5   无效的对象名称'dbo.alabla'。

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

1 个答案:

答案 0 :(得分:1)

看看这里: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

btw:如果您只想读取数据,我不会使用SP。上面的例子将是一个内联(单一陈述,特别)TVF的完美候选人......