2010-09-01 45 views
4

我正在从我的数据库中的一个常用表中删除一列。 上次我做了这个错误,开始从我早已遗忘的各种存储过程中爬出来;抱怨失踪的专栏。 (只有当存储过程被称为)如何停止存储过程中抱怨我将要在SQL Server 2008中删除的缺失列?

所以,我不想让这些事情再次啰嗦,我想确保所有存储过程在我实际删除它之前是免费的。

什么是最好的方式来搜索所有存储过程(我有相当多的),并删除对该列的引用?

我试图在菜单中找到一个选项来做到这一点,但我没有发现任何非常明显的做到这一点。

任何帮助,(除了告诉我逐一通过他们)赞赏。
ps:当然,如果你确实告诉我,这并不意味着我会贬低你的评论。我只会赞成:P
(没错,只是在开玩笑!)

回答

2

使用此脚本。它也会返回触发器。如果许多表具有相同名称的列,则可以将故事名称添加到其中。这个脚本适用于2005年的MSSQL 2000。我在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子句

+0

+1唯一需要注意的是,你们希望你不要有疑问漂浮在你的代码:-) – InSane 2010-09-01 08:51:18

+0

这是完美的感谢!它列出了所有存储的过程,(我没有使用任何触发器..但是!)谢谢! – iamserious 2010-09-01 08:54:11

+0

@In萨:不,我没有在我的C#ANY querries,我做的工作100%的存储特效(或至少尽可能地),然后我在项目中单独的东西有数据访问层..所以我我曾经是一位快乐的编码员! – iamserious 2010-09-01 08:56:28

1

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

下面的存储过程应该能够列出所有其文本包含所需的字符串存储过程的代码(所以,把你的列名,并离火):

CREATE PROCEDURE Find_Text_In_SP 
@StringToSearch varchar(100) 
AS 
    SET @StringToSearch = '%' [email protected] + '%' 
    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

+0

这只会搜索程序名称 – devio 2010-09-01 08:52:05

+0

这将创建一个新的存储过程在数据库中,我将不得不删除每次我完成运行它的权利? – iamserious 2010-09-01 08:54:49

+0

我会将存储过程留在那里以备将来使用;如果你不想,那么简单地使用SELECT命令本身的代码(从“SELECT Distinct SO.Name”到“Order by SO.Name”的所有内容) - 不要忘了用“@stringtosearch”替换“@stringtosearch” %desired_column_name%') – 2010-09-01 09:26:51

3

要添加到各种TSQL的解决方案,有一个自由从红门集成到SSMS中的OL:SQL Search

+0

哇! +1这个工具..我使用红门的数据比较和SQL比较(7),他们是惊人的..这个工具是免费的,哇。谢谢 ! – iamserious 2010-09-01 08:59:15

+0

+1为真棒工具。 – 2010-09-01 09:01:45

1

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

sp_depends 'TableName' 

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

0

如果您使用MS SQL不迟于2000年的版本,这是更好地搜索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; 

你应该知道,这个搜索发现包含文本,任何程序,无论它是实际的列名和表该列属于。

2

红门软件的SQL Prompt 5有几个新功能,可能在这种情况下是有用的:

  • 列依赖性:列名悬停在脚本中突然冒出包含列表的窗口所有使用该列的对象
  • 查找无效对象:横跨不能使用的数据库显示的对象,往往是因为他们使用的是已被删除

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

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

相关问题