查找特定值的列名或表名

时间:2016-11-08 04:50:10

标签: sql-server search dynamic-sql columnname tablename

我希望在我的数据库中搜索特定值,我不知道它到底在哪里。是否存在返回SQL Server中特定值的列名或表名的查询? 假设我有一个像123这样的列的值,但我不知道123属于哪个表,我不知道它的列名。我可以编写查询来查找此值在其中的表名吗? 我需要查询而不是程序!!!

1 个答案:

答案 0 :(得分:0)

这可能适合你。请注意,如果您有很多表/列,这可能需要一段时间。如果您未在(N)VARCHAR列中进行搜索,则可能需要将这些类型添加到c.DATA_TYPE NOT IN(...子句中。或者您没有查看的任何其他类型(例如FLOATDECIMAL)。

SET NOCOUNT ON;
DECLARE @value NVARCHAR(MAX)='123';
CREATE TABLE #found(table_name SYSNAME,column_name SYSNAME);
DECLARE @sql NVARCHAR(MAX)=(
    SELECT
        'INSERT INTO #found(table_name,column_name) ' +
        'SELECT TOP 1 '+
            'table_name='''+REPLACE(t.TABLE_NAME,'''','''''')+''','+
            'column_name='''+REPLACE(c.COLUMN_NAME,'''','''''')+''' '+
        'FROM '+
            QUOTENAME(t.TABLE_SCHEMA)+'.'+QUOTENAME(t.TABLE_NAME)+' '+
        'WHERE '+
            QUOTENAME(c.COLUMN_NAME)+'='''+REPLACE(@value,'''','''''')+''';'
    FROM
        INFORMATION_SCHEMA.TABLES AS t
        INNER JOIN INFORMATION_SCHEMA.COLUMNS AS c ON
            c.TABLE_SCHEMA=t.TABLE_SCHEMA AND
            c.TABLE_NAME=t.TABLE_NAME
    WHERE
        t.TABLE_TYPE='BASE TABLE' AND 
        c.DATA_TYPE NOT IN('BIT','NTEXT','TEXT','IMAGE','BINARY','VARBINARY','DATETIME','DATE','DATETIME2','TIME','SMALLDATETIME','DATETIMEOFFSET')
    FOR XML
        PATH('')
);

EXECUTE (@sql);
SELECT * FROM #found ORDER BY table_name,column_name;
DROP TABLE #found;