Sql server 查找特定值的列名或表名

Sql server 查找特定值的列名或表名,sql-server,search,dynamic-sql,columnname,tablename,Sql Server,Search,Dynamic Sql,Columnname,Tablename,我想在我的数据库中搜索一个我不知道确切位置的特定值。在SQL server中是否存在返回特定值的列名或表名的查询? 假设我有一个像123这样的列的值,但我不知道123属于哪个表,也不知道它的列名。我可以写一个查询来查找这个值所在的表名吗? 我需要一个查询,而不是一个过程 这可能对你有用。请注意,如果有很多表/列,这可能需要相当长的时间。如果您没有在(N)VARCHAR列中搜索,您可能希望将这些类型添加到c.DATA\u类型not in(…子句)。或任何其他您没有查找的类型(如FLOAT或DECI

我想在我的数据库中搜索一个我不知道确切位置的特定值。在SQL server中是否存在返回特定值的列名或表名的查询? 假设我有一个像123这样的列的值,但我不知道123属于哪个表,也不知道它的列名。我可以写一个查询来查找这个值所在的表名吗?
我需要一个查询,而不是一个过程

这可能对你有用。请注意,如果有很多表/列,这可能需要相当长的时间。如果您没有在
(N)VARCHAR
列中搜索,您可能希望将这些类型添加到
c.DATA\u类型not in(…
子句)。或任何其他您没有查找的类型(如
FLOAT
DECIMAL


注意:如果您知道要查找的数据类型,则最好通过将
c.DATA\u TYPE写入(…
而不是
c.DATA\u TYPE不在(…
)来限制您要查找的类型。如果这是您设计的数据库,则可能是数据模型损坏的迹象。相同“类型”的值,因此值是可比较的或可计算的,应该存储在一个表的一列中。如果它们跨多个列/表存储,则应该是数据的值很可能已作为元数据(如列或表名)嵌入到模型中。
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;