今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不修改它,使用内联查询,
通过执行以下查询,一切都进行得很顺利:
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,16级,状态1,过程GetALL,第5行 无效的对象名'dbo.alabla‘。
这里有人知道我们如何确保内联查询执行是安全的吗?
发布于 2016-01-08 12:37:43
看看这里: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 (以及相关的:参见所提到的页面上的链接)。
这会迫使我们立即进行汇编..。
进一步看一看
顺便说一句:如果你只想读取数据,我不会使用SP。您上面的例子将是一个完美的候选人,一个无法(单语句,临时)的TVF.
https://stackoverflow.com/questions/34676102
复制相似问题