在数据库中的未知表中查找特定列条目?

时间:2011-04-28 12:30:31

标签: sql sql-server sql-server-2008-r2 information-schema

我知道这个话题(Find a specific column in an unknown table in a database?),我的问题非常相似。我需要的查询与此相似(我认为):

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%watcher%'

但我需要的是一个查询,其中列名称未知,但我知道内容是什么,我想知道表/列的名称是什么。 (我知道这听起来很奇怪: - /)。 我有可能吗?

6 个答案:

答案 0 :(得分:6)

尝试使用ApexSQL Search - 它搜索对象和数据,它是一个类似于Red Gate的SQL搜索的免费工具。

如果您不想处理第三方工具,另一个选择是使用游标迭代所有表中的所有列的查询,但我担心它会变得太复杂和性能密集。

答案 1 :(得分:4)

好的,我认为对于你的问题,你需要动态的sql,所以首先看一下this link。如果这还不够,想到的唯一解决方案就是游标,所以我建议你继续寻找其他人实现你的问题。也就是说,您可以尝试以下代码(但您应该首先在小表上测试它)。

DECLARE @Query NVARCHAR(MAX), @Column NVARCHAR(100), @Table NVARCHAR(100)
DECLARE @Search NVARCHAR(100)
SET @Search = 'Your string'

CREATE TABLE #Results(Table_Name VARCHAR(100), Column_Name VARCHAR(100))

DECLARE Col CURSOR FOR
SELECT Table_Name, Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLLATION_NAME IS NOT NULL
ORDER BY TABLE_NAME, ORDINAL_POSITION

OPEN Col
FETCH NEXT FROM Col INTO @Table, @Column
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = 'IF EXISTS (SELECT * FROM '+QUOTENAME(@Table)+' WHERE '+QUOTENAME(@Column)+'='''+@Search+''')
                    SELECT '''+@Table+''','''+@Column+''''

    INSERT INTO #Results
    EXEC sp_executesql @Query
    FETCH NEXT FROM Col INTO @Table, @Column
END
CLOSE Col
DEALLOCATE Col

SELECT * FROM #Results

答案 2 :(得分:2)

查看名为SQL Search免费 Red-Gate工具,它会在整个数据库中搜索任何类型的字符串。

enter image description here

enter image description here

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

答案 3 :(得分:1)

使用SQL Workbench/J,您可以运行以下语句:

WbGrepData -searchValue=watcher

它将搜索所有(可访问)表中的所有列,并返回在至少一列中找到搜索词的所有行。

答案 4 :(得分:0)


USE DBName

GO

SELECT t.name AS table_name,

SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name

FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID

WHERE c.name LIKE '%ColumName start from%'

ORDER BY schema_name, table_name;

答案 5 :(得分:0)

它也可以帮助

DECLARE @columnName as varchar(100)
SET @columnName = 'ColumnName'

SELECT t.name AS Table, c.name AS Column,
ty.name AS Tipo, c.max_length AS Length
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE c.name LIKE @columnName
ORDER BY t.name, c.name