簡體   English   中英

在數據庫的所有列和所有表中搜索一個值

[英]Search for a value in all column and all tables of a database

我想找到包含值“Commerciale”的列名,但我不知道列名或表,所以我需要在整個數據庫中搜索。 我如何通過查詢來做到這一點?

我正在使用 SQL 服務器

您可以使用系統表:

SELECT 
    c.name ColumnName
 , t.name TableName
FROM sys.columns AS c
JOIN sys.tables AS t
ON c.object_id = t.object_id
WHERE c.name like '%Commerciale%'

如果您正在尋找名稱為Commerciale的列,那么您可以簡單地使用sys對象:

SELECT s.[name] AS SchemaName,
       t.[name] AS TableName,
       c.[name] AS ColumnName
FROM sys.schemas s
     JOIN sys.tables t ON s.schema_id = t.schema_id
     JOIN sys.columns c ON t.object_id = c.object_id
WHERE c.[name] = N'Commerciale';

但是,如果您需要搜索行中值的內容,則需要使用動態 SQL。 這將為數據庫中至少有 1 個字符串類型列的每個表返回一個數據集,並將返回其中一個列的值為'Commerciale'任何行。 如果它需要包含該值,請將WHERE更改為在其子句中使用LIKE (請注意,查詢將非常緩慢):

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = STUFF((SELECT @CRLF +
                         N'SELECT N' + QUOTENAME(s.[name],'''') + N' AS SchemaName,' + @CRLF +
                         N'       N' + QUOTENAME(t.[name],'''') + N' AS TableName,' + @CRLF +
                         N'       *' + @CRLF +
                         N'FROM ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + @CRLF + 
                         N'WHERE ' +
                         STUFF((SELECT @CRLF +
                                       N'  AND ' + QUOTENAME(c.[name]) + N' = ''Commerciale'''
                                FROM sys.columns c
                                     JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                                WHERE c.object_id = t.object_id
                                  AND ct.[name] IN (N'char',N'varchar',N'nchar',N'nvarchar')
                                FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,8,N'') + N';'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                  FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,2,N'');

--PRINT @SQL; --YOu best friend

EXEC sp_executesql @SQL;

這不會告訴您哪一列具有價值,您需要用自己的眼睛來做到這一點,但我不喜歡編寫動態表動態 pivot。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM