SQL Query从所有数据库中查找特定列

时间:2017-11-15 05:17:46

标签: sql-server database

我想找出包含单词" 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

3 个答案:

答案 0 :(得分:0)

如果您需要按名称查找数据库对象(例如表格,列,触发器) - 请查看名为SQL Search免费红门工具,它会执行此操作 - 它会搜索您的整个数据库中的任何类型的字符串。

enter image description here

enter image description here

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用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