【问题标题】:How can i find out which tables in which databases have a column with a given name in SQL Server Management Studio?如何在 SQL Server Management Studio 中找出哪些数据库中的哪些表具有具有给定名称的列?
【发布时间】:2017-03-27 15:59:07
【问题描述】:

在 SQL Server 2016 Management Studio 中,我有多个数据库。

我想找出哪些数据库中的哪些表有一个名称包含字符串的列。我该怎么做?

是否可以在对象资源管理器窗口中进行搜索?

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

您可以使用sp_MSForeeachdb

此方法将为您服务器上的每个数据库收集 INFORMATION_SCHEMA.COLUMNS

Select * Into #TempFields From INFORMATION_SCHEMA.COLUMNS where 1=0

Declare @SQL varchar(max)=';Use [?]; Insert Into #TempFields Select * From INFORMATION_SCHEMA.COLUMNS '     
Execute master.sys.sp_MSforeachdb @SQL
Select * from #TempFields
 Where Column_Name Like '%XYZ%'

编辑 - 要求评论

第一个查询创建一个 EMPTY 结构来保存 Information_Schema

然后我们声明@SQL,其中包含我们要为每个数据库执行的 SQL。注意 ;使用 [?];

然后我们只需选择#Temp 表以获得所需的结果

【讨论】:

  • 谢谢。实际上,我想找出哪些数据库中的哪些表有一个名称包含字符串的列,而不是具有给定名称的列。
  • @Tim 如果我理解您的要求,只需将最后的 WHERE 更改为 Where Column_Name like '%XYZ%'
  • 非常感谢。您能否对这些语句的作用进行一些解释?我了解基本的 SQL 命令,但不太确定代码中的命令是做什么的。
【解决方案2】:

您需要迭代服务器上的数据库,

SELECT name FROM master.dbo.sysdatabases

对每一个执行以下命令,使用

select table_name,COLUMN_NAME 
from INFORMATION_SCHEMA.columns 
where COLUMN_NAME like '% XXX %'

用光标来做

    CREATE TABLE #tmpList (DatabaseName varchar(64),TableName varchar(64))
    DECLARE @DbName varchar(64)
    DECLARE @sql nvarchar(max)

    DECLARE @ColCursor  CURSOR


    SET @colCursor = CURSOR FOR
        SELECT [name] FROM master.dbo.sysdatabases

    OPEN @ColCursor
    FETCH NEXT FROM @ColCursor INTO @DBName

    WHILE @@FETCH_STATUS = 0
    BEGIN

        SET @sql = 'INSERT INTO #tmpList '+
                    'SELECT '''+@DbName+''',table_Name FROM '+@dbName+'.INFORMATION_SCHEMA.columns where COLUMN_NAME like ''% XXX %'' '
        EXEC(@sql)
        FETCH NEXT FROM @ColCursor INTO @DBName 
    END
    CLOSE @ColCursor;

select * from #tmpList
drop table #tmpList

【讨论】:

    【解决方案3】:

    在每个数据库上运行以下命令,或使用 cursordynamic sql 迭代每个数据库

    select A.name,B.name From sys.objects as A 
    inner join sys.all_columns as B
    on B.object_id = A.object_id
    
    where A.type = 'U' and B.name = ...
    

    更新: 对于模糊查找,使用B.name like '%serarch_pttern%%表示任何前导或尾随字符

    【讨论】:

    • 谢谢。实际上,我想找出哪些数据库中的哪些表有一个名称包含字符串的列,而不是具有给定名称的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2010-10-31
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多