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

如何阻止存储进程抱怨我将在SQL Server 2008中删除的丢失列?

  •  4
  • iamserious  · 技术社区  · 16 年前

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

    所以,我不想再对这些东西感到厌烦了,我想确保所有存储的进程在我真正删除它之前都没有这个列。

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

    我试图在菜单中找到一个选项来做这个,但是我没有找到任何明显的方法来做这个。

    任何帮助(除了告诉我一个接一个地经历这些帮助之外)都会受到感激。
    附言:当然,这并不意味着如果你告诉我,我会贬低你的评论。我只投反对票:P
    (不,开玩笑吧!)

    6 回复  |  直到 15 年前
        1
  •  2
  •   Beska    15 年前

    使用这个脚本。它还将返回触发器。如果许多表的列具有相同的名称,您也可以将故事名称添加到where。此脚本适用于MSSQL2000、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子句

        2
  •  3
  •   AdaTheDev    16 年前

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

        3
  •  2
  •   Paul Stephenson    15 年前

    红门软件 SQL Prompt 5 有一些在这种情况下可能有用的新功能:

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

    你可以下载一个14天的免费试用版,看看这个工具是否对你有用。

    斯蒂芬森
    SQL提示项目管理器
    红门软件

        4
  •  1
  •   abatishchev Karl Johan    16 年前

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

    sp_depends 'TableName'
    

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

        5
  •  1
  •   nsmyself    16 年前

    编辑: 对不起,我的坏消息。这是用于在存储过程的代码中搜索的代码

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

    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

        6
  •  0
  •   devio    16 年前

    如果您在2000版之后使用MS SQL,则最好搜索 sys.sql_modules 而不是 sys.syscomments ,因为syscomments只保存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;
    

    您应该知道这个搜索会发现 任何 包含该文本的过程,无论它是否为实际的列名称以及列所属的表。