4

我知道这个主题(在数据库中的未知表中查找特定列?),我的问题非常相似。我需要的查询与这个非常相似(我认为):

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

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

4

6 回答 6

6

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

如果您不想使用第三方工具,另一种选择是查询,它将使用游标遍历所有表中的所有列,但我担心它会变得过于复杂和性能密集。

于 2013-04-29T08:50:32.870 回答
4

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

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
于 2011-04-28T13:59:14.580 回答
2

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

在此处输入图像描述

在此处输入图像描述

对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具——我是否已经提到它完全免费用于任何用途?

于 2011-04-28T12:59:38.150 回答
1

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

WbGrepData -searchValue=watcher

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

于 2011-04-28T14:03:04.557 回答
0
使用数据库名称

去

SELECT t.name AS table_name,

SCHEMA_NAME(schema_id) 作为模式名,
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%'

按模式名、表名排序;

于 2013-11-29T07:09:04.760 回答
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
于 2014-03-14T14:22:15.583 回答