在整个SQL数据库中搜索列

时间:2010-11-17 17:13:56

标签: sql-server

我需要更改列的数据类型,但我并不是数据库中可能引用它的每个位置。是否有脚本或应用程序可以搜索数据库中的所有视图,存储过程,函数,表计算列等,并显示引用该列的内容?我使用的是SQL Server 2005 Standard。

谢谢, 亚伦

4 个答案:

答案 0 :(得分:5)

您始终可以检查sys.columns目录视图:

SELECT  
    c.NAME 'Col Name',
    OBJECT_NAME(c.OBJECT_ID) 'Table Name',
    t.name
FROM
    sys.columns c
INNER JOIN 
    sys.types t ON c.system_type_id = t.system_type_id
WHERE
    c.Name = 'your-column-name-here'

并根据该信息,您可以为数据库生成ALTER语句:

SELECT  
    'ALTER TABLE dbo.' + OBJECT_NAME(c.OBJECT_ID) +
    ' ALTER COLUMN ' + c.NAME ' NewDataType NULL'
FROM
    sys.columns c
WHERE
    c.Name = 'your-column-name-here'

此查询生成一组ALTER TABLE ....语句,然后您可以将这些语句复制到SSMS查询窗口并执行。

警告提示:如果正在引用任何列 - 在外键关系中,或者对它们存在默认或检查约束 - 此方法可能会失败。在这种情况下,您需要为这些列执行一些额外的步骤(例如首先删除约束等)。

更新:搜索表格中定义的列。

如果您需要搜索存储过程,查看和功能,我强烈建议使用Red-Gate的优秀且免费(!!)SQL Search实用程序 - 非常棒!

答案 1 :(得分:2)

我喜欢使用redgate软件的免费搜索加载项工具。我很惊讶它有多么有用 - 你可以用它快速找到对文本的所有引用。

此描述来自SQL Curry:

SQL搜索在存储过程,函数,视图等中查找SQL文本的片段,一旦找到它们,它就可以快速允许您单击并跳转到对象,无论它们位于服务器上的哪个位置。这很酷!

以下是链接:SQL Search

答案 2 :(得分:0)

此查询将帮助您查找任何表的列及其引用的列 -

SELECT OBJECT_NAME(f.parent_object_id) AS [Table], COL_NAME(fc.parent_object_id,fc.parent_column_id) AS [Column],
OBJECT_NAME (f.referenced_object_id) AS RefTable,     COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS RefColumn, 
f.name AS FK

FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc 
ON f.OBJECT_ID = fc.constraint_object_id

WHERE OBJECT_NAME(f.parent_object_id) = '<your table name>'
AND COL_NAME(fc.parent_object_id,fc.parent_column_id) = '<your column name>'

答案 3 :(得分:0)

我为Red Gate工作,我看到已经提到过SQL Search。很高兴,对你有用。另一个可以专门列出列依赖关系的工具是SQL Prompt 5,即将发布。您可以访问:http://www.surveymk.com/s.aspx?sm=zDJogAY5rwdIwOX/SqtTCQ%3d%3d并加入早期访问列表来下载EA版本。我欢迎您试一试,如果不符合您的要求,请告诉我。它具有的另一个重要功能是能够列出无效对象。换句话说,如果重命名一个列并且您有一个引用旧列的存储过程,它会引起您的注意。