代码之家  ›  专栏  ›  技术社区  ›  DareDevil

sp_executesql不验证查询字符串

  •  1
  • DareDevil  · 技术社区  · 10 年前

    今天我面临最糟糕的情况。数据库中有一个存储过程,我不得不使用内联查询对其进行修改,

    通过执行此查询,一切都很顺利:

    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”无效。

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

    1 回复  |  直到 10 年前
        1
  •  1
  •   Community Mohan Dere    8 年前

    请在此处查看: 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检查db
    • DBCC FREEPROCCACHE
    • DBCC进程缓存

    顺便说一句:如果你只想读取数据,我不会使用SP。你上面的例子将是一个可内联(单语句,ad-hoc)TVF的完美人选。。。