【问题标题】:How to stop stored procs from whining about a missing column that I am about to delete in SQL Server 2008?如何阻止存储过程抱怨我将在 SQL Server 2008 中删除的缺失列?
【发布时间】:2011-01-07 02:39:13
【问题描述】:

我正在从我的数据库中的一个常用表中删除一列。 上次我做这个错误开始从我早就忘记存在的各种存储过程中爬出来;抱怨缺少的列。 (仅当调用该存储过程时)

所以,我不想再被这些东西缠住了,我想在我实际删除它之前确保所有存储的过程都没有该列。

搜索所有存储过程(我有很多)并删除对该列的引用的最佳方法是什么?

我试图在菜单中找到一个选项来执行此操作,但我没有发现任何非常明显的操作。

感谢您的任何帮助(除了告诉我一一完成)。
ps:当然,不代表如果你告诉我我会贬低你的评论。我只会投反对票:P
(不,开玩笑的!)

【问题讨论】:

    标签: sql-server search stored-procedures


    【解决方案1】:

    要添加到各种 TSQL 解决方案,Red Gate 提供了一个集成到 SSMS 中的免费工具:SQL Search

    【讨论】:

    • 哇!! +1 这个工具..我正在使用 Red Gate 的数据比较和 SQL 比较 (7),它们很棒......而且这个工具是免费的,哇。谢谢!
    【解决方案2】:

    使用这个脚本。它还将返回触发器。如果许多表具有相同名称的列,您也可以将故事名称添加到 where。此脚本适用于 MSSQL 2000、2005。我尚未在 2008 上对其进行测试,但它也应该可以正常工作。

    SELECT o.name
    FROM sysobjects o
        INNER JOIN syscomments c ON o.id = c.id
    WHERE c.text like '%column_name%'
    

    编辑:如果您只想过滤它以存储过程,请将 AND type ='P' 添加到 where 子句

    【讨论】:

    • +1 唯一需要注意的是,您希望您的代码中没有浮动查询:-)
    • 非常感谢!它列出了所有存储的过程,(我还没有使用任何触发器..!)非常感谢!
    • @In Sane: 不,我的 c# 中没有任何查询,我在存储过程中完成 100% 的工作(或至少尽可能多),然后我的项目中有数据访问层分开的东西..所以我,这一次,一个快乐的编码员!
    【解决方案3】:

    Red Gate Software 的SQL Prompt 5 有几个新功能可能在这种情况下有用:

    • 列依赖:将鼠标悬停在脚本中的列名上,会弹出一个窗口,其中包含使用该列的所有对象的列表
    • 查找无效对象:显示整个数据库中无法使用的对象,通常是因为它们使用了已删除的列

    您可以下载 14 天免费试用版,看看该工具是否对您有用。

    保罗·斯蒂芬森
    SQL 提示项目经理
    红门软件

    【讨论】:

      【解决方案4】:

      您可以使用该表的依赖选项来查找依赖于该表的过程或函数的依赖对象或列表。 使用下面的脚本

      sp_depends 'TableName'
      

      另一个选项是为包含但会过滤过程或函数中的所有文本的列创建脚本。

      【讨论】:

        【解决方案5】:

        编辑:对不起,我的错。这是在存储过程的代码中搜索的代码

        以下存储过程应该能够列出其文本包含所需字符串的所有存储过程(因此,将列名放入其中并启动):

        CREATE PROCEDURE Find_Text_In_SP
        @StringToSearch varchar(100) 
        AS 
           SET @StringToSearch = '%' +@StringToSearch + '%'
           SELECT Distinct SO.Name
           FROM sysobjects SO (NOLOCK)
           INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
           AND SO.Type = 'P'
           AND SC.Text LIKE @stringtosearch
           ORDER BY SO.Name
        GO
        

        用法:

        exec Find_Text_In_SP 'desired_column_name'
        

        来源here

        【讨论】:

        • 这只会搜索过程名称
        • 这将在数据库中创建一个新的存储过程,每次我完成运行时都必须删除它,对吗?
        • 我会把存储过程留在那里以备将来使用;如果您不想这样做,那么只需使用 SELECT 命令本身的代码(从“SELECT Distinct SO.Name”到“Order by SO.Name”的所有内容 - 不要忘记将“@stringtosearch”替换为 ' %desired_column_name%')
        【解决方案6】:

        如果你使用MS SQL 2000以后的版本,最好搜索sys.sql_modules而不是sys.syscomments,因为syscmets只保存nvarchar(4000)的记录,而你要查找的文本可能会分成两条记录.

        因此,虽然您可以从 MSDN 使用这样的查询

        SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition
        FROM sys.sql_modules AS sm
        JOIN sys.objects AS o ON sm.object_id = o.object_id
        WHERE sm.definition like '%' + @ColumnName + '%'
        ORDER BY o.type;
        

        您应该知道,此搜索会找到包含该文本的任何过程,无论它是否是实际的列名以及该列属于哪个表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-04
          • 2020-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-26
          相关资源
          最近更新 更多