在整个 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 数据库中搜索列的主要内容,如果未能解决你的问题,请参考以下文章