今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不使用内联查询来改变它,
执行此查询一切顺利:
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'。
有人可以告诉我们如何确保内联查询执行安全吗?
答案 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
(并且相关:请参阅相关链接页面提到)。
这应该强制立即编译......
进一步看看
btw:如果您只想读取数据,我不会使用SP。上面的例子将是一个内联(单一陈述,特别)TVF的完美候选人......