今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不更改它,使用内联查询,
通过执行以下查询,一切都很顺利:
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的完美候选者。。。