【问题标题】:SQL Query to find out specific column from all databaseSQL查询从所有数据库中找出特定列
【发布时间】:2018-04-28 05:36:36
【问题描述】:

我想找出包含单词“VAP”或取消的列。但问题是我们的服务器中有多个数据库。我想知道哪个数据库/表中包含包含这些单词的列名。谁能告诉我们是否有任何查询可用于从所有数据库中搜索列名?我已经尝试过以下查询,但它只会帮助从单个数据库中查找。

select distinct
    t.name as TableName,
    SCHEMA_NAME(t.schema_id)   as TableSchema,
    c.name as ColumnName,
    ct.name as ColumnDataType,
    c.is_nullable as IsNullable
from 
    sys.tables t with(nolock)
inner join 
    sys.columns c with(nolock) on t.object_id = c.object_id
inner join 
    sys.types ct with(nolock) on ct.system_type_id = c.system_type_id
where 
    c.name like '%VAP%'
order by 
    t.name

【问题讨论】:

标签: sql-server database


【解决方案1】:

如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为 SQL SearchFREE Red-Gate 工具 - 它会搜索您的整个任何类型字符串的数据库。

对于任何 DBA 或数据库开发人员来说,它都是必备工具 - 我是否已经提到它绝对免费可用于任何用途??

【讨论】:

    【解决方案2】:

    我知道这有点冗长,但是如果您不想使用任何第三方应用程序,可以使用此查询

    USE [master]
    GO
    DECLARE @Search VARCHAR(50)='A',@SQL VARCHAR(MAX)
    DECLARE @Min INT,@Max INT
    DECLARE @Table TABLE
    (
        SeqNo INT IDENTITY(1,1),
        DatabaseNm VARCHAR(255),
        TableName VARCHAR(255),
        ColumnName VARCHAR(255)
    )
    DECLARE @TEMP TABLE
    (
        SeqNo INT IDENTITY(1,1),
        Qry VARCHAR(MAX)
    )
    
    INSERT INTO @TEMP
    (
        Qry
    )
    SELECT 
        Qry = 'SELECT 
            DbNm = '''+name+''',
            TblNm = [TABLE_SCHEMA]+''.''+[TABLE_NAME],
            COlNm = COLUMN_NAME
            FROM ['+name+'].INFORMATION_SCHEMA.COLUMNS 
                WHERE COLUMN_NAME LIKE ''%'+ISNULL(@Search,'')+'%''' 
        FROM sys.databases
    
    SELECT
        @Min = MIN(SeqNo),
        @Max = MAX(SeqNo)
        FROM @TEMP
    
    WHILE ISNULL(@Min,0)<=ISNULL(@Max,0)
    BEGIN
    
        SELECT
            @SQL = Qry
            FROM @TEMP
                WHERE SeqNo = @Min
    
        INSERT INTO @Table
        (
            DatabaseNm,
            TableName,
            ColumnName
        )
        EXEC(@SQL)
    
    
        SELECT
            @Min = ISNULL(@Min,0)+1
    END
    
    
    SELECT
        *
        FROM @Table
    

    【讨论】:

    • 使用QUOTENAME。您的脚本会通过元数据名称进行 SQL 注入。
    【解决方案3】:

    使用 sp_MSForeachdb 获取详细信息。试试下面的查询。

    -------------------------
    
    create table #temp
    (dbname varchar(100),
    tablename varchar(100)
    ) 
    
    EXECUTE master..sp_MSForeachdb ' 
    USE [?]
    IF ''?'' <> ''master'' AND ''?'' <> ''model'' AND ''?'' <> ''msdb'' AND ''?'' <> ''tempdb''
    BEGIN
    
    
    IF (EXISTS (SELECT * 
                     FROM INFORMATION_SCHEMA.columns where COLUMN_NAME = ''VAP''))
    BEGIN
    insert into #temp
    select ''?'',table_name FROM INFORMATION_SCHEMA.columns where COLUMN_NAME = ''VAP''
    
    
    
    end   
    
    
    END
    '
    
    select * from #temp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多