在整个 SQL 数据库中搜索列

Posted

技术标签:

【中文标题】在整个 SQL 数据库中搜索列【英文标题】:Search for column in entire SQL database 【发布时间】:2010-11-17 17:13:56 【问题描述】:

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

谢谢, 亚伦

【问题讨论】:

您要更改的数据类型是什么? 一个问题:即使您有这样的脚本,也无法涵盖您的应用程序可能正在构建的任何动态 SQL(EXEC 语句)或临时 SQL。 我正在从 bit 变为 varchar(1)。 【参考方案1】:

您可以随时查看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 实用程序 - 非常棒的东西!

【讨论】:

感谢您的快速回复。但是这样搜索存储过程和用户​​定义的函数吗? 不,它会搜索表中定义的列。 好的,Red-Gate 实用程序正是我所需要的。谢谢。 我还刚刚安装了 Red Gate SQL 搜索实用程序,它运行良好。我刚刚搜索了一个列名,它准确地返回了 3 个视图和 1 个存储过程的结果。非常感谢您的推荐。【参考方案2】:

我喜欢使用 redgate 软件提供的免费搜索插件工具。我对它的实用性感到惊讶——你可以用它快速找到所有对文本的引用。

此描述来自 SQL Curry:

SQL 搜索可在存储过程、函数、视图等中查找 SQL 文本片段,一旦找到它们,您就可以快速单击并跳转到对象,无论它们恰好在您的服务器上。太酷了!

这里是链接:SQL Search

【讨论】:

【参考方案3】:

此查询将帮助您找到任何表的列和它所引用的列 -

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>'

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在整个 SQL 数据库中搜索列的主要内容,如果未能解决你的问题,请参考以下文章

PL / SQL 在整个数据库中搜索字符串

如果整个列数据与搜索字符串匹配,如何在jQUERY Datatable中显示/搜索数据?

sql 在整个数据库中查找列(通过某些字符串)

sql 在数据库中搜索列

在 SQL Server 表中搜索值列表的最有效方法

SQL:如何在数据库中的所有视图中搜索 ID 并列出提供结果的视图和列名称? [复制]