我想在我的数据库中搜索一个我不知道具体位置的特定值。 SQL Server 中是否存在返回特定值的列名或表名的查询? 假设我有一个像 123 这样的列的值,但我不知道 123 属于哪个表,也不知道它的列名。我可以编写一个查询来查找该值所在的表名吗? 我需要一个查询而不是一个程序!!!
这可能会为你做。请注意,如果您有很多表/列,这可能需要相当长的时间。如果您不在
(N)VARCHAR
列中搜索,您可能希望将这些类型添加到 c.DATA_TYPE NOT IN(...
子句中。或任何其他你不在看的类型(如FLOAT
或DECIMAL
)。
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;