【问题标题】:How do identify stored procedure containing dynamic sql如何识别包含动态sql的存储过程
【发布时间】:2015-04-01 07:34:05
【问题描述】:

识别包含动态 SQL 的存储过程的最佳方法是什么?我创建了这个 SQL 语句:

SELECT * 
FROM sys.sql_modules  
WHERE 
    REPLACE(definition,' ','') LIKE '%exec(%' 
    OR definition LIKE '%sp_executesql%' 
    OR REPLACE(definition,' ','') LIKE '%execute(%'

它会找到所有实例吗?

【问题讨论】:

  • 只要你的动态 SQL 总是以 exec(定义, ' ', '')" 虽然看起来你让它工作得比它需要的更努力
  • 你可以通过这种方式得到一些误报,但我想如果不解析 SQL 是不可避免的。
  • 您的查询似乎处理了您调用/执行动态 SQL 的最常见情况。我认为您的查询是正确的。以下链接12可供参考。
  • @ChristianBarron 我这样做是因为无法确定代码是如何编写的。它可以是“exec('select ...')”或“exec('select ...')”甚至是“exec('select ...')”
  • @KubaWyrostek 我可以忍受误报。但需要找到所有实例

标签: sql sql-server-2008 dynamic-sql


【解决方案1】:

我无法为您提供确切的示例,但我可能会为您指明正确的方向。 Microsoft 的类负责解析和生成 SQL 批处理。您可能可以使用这些类来解析存储过程的内容并查找所有可能的 real 动态 sql 调用。

更多信息在这里:https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.transactsql.scriptdom(v=sql.110).aspx

我不确定这是否也包括 SQL 2008。对此感到抱歉。

以下是如何使用这些类删除 SQL 脚本中的 cmets 的示例:

http://michaeljswart.com/2014/04/removing-comments-from-sql/

编辑

还有更老的,也是微软的解决方案,可以解析 SQL 语句。没有那么强大,但兼容 SQL 2008。请检查这是否适合您的需求:

https://technet.microsoft.com/en-us/library/microsoft.sqlserver.management.sqlparser.parser(v=sql.105).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多