Как динамически искать ключевое слово во всех столбцах таблицы - PullRequest
1 голос
/ 13 июня 2019

Я хочу иметь возможность динамически искать определенное ключевое слово во всех столбцах таблицы.Сценарий должен состоять в том, чтобы изменить только ключевое слово и имя таблицы без необходимости знать, каковы все столбцы таблицы.

Это означает, что следующий код не является удовлетворительным решением:

[...] WHERE 'ключевое слово' IN (field1, field2, field3, field4, ...) [...]

Мне удалось получить все имена столбцовтаблица динамически с использованием подзапроса.Но затем оператор IN в этом подзапросе возвращает пустой результат.

Затем я создал новый подзапрос, который возвращает список столбцов в формате списка через запятую.Но результат также является пустым.

Вот сценарий на данный момент:

DECLARE @DATABASE_NAME VARCHAR(128)
DECLARE @SCHEMA_NAME VARCHAR(128)
DECLARE @TABLE_NAME VARCHAR(128)
DECLARE @KEYWORD VARCHAR(128)
DECLARE @QUERY01 VARCHAR(MAX)
DECLARE @QUERY02 VARCHAR(MAX)
DECLARE @SUBQUERY01 VARCHAR(MAX)
DECLARE @SUBQUERY02 VARCHAR(MAX)

SET @DATABASE_NAME = '[xxx]'
SET @SCHEMA_NAME = '[dbo]'
SET @TABLE_NAME = 'tblCustomers'
SET @KEYWORD = 'Jean'

SET @SUBQUERY01 = 'SELECT Name FROM sys.columns WHERE object_id = (SELECT 
object_id FROM sys.tables WHERE name = ''' + @TABLE_NAME + ''')'
SET @SUBQUERY02 = 'SELECT SUBSTRING((SELECT '', '' + Name FROM 
sys.columns WHERE object_id = (SELECT object_id FROM sys.tables WHERE 
name = ''' + @TABLE_NAME + ''') FOR XML PATH('''')), 2, 1000000)'

SET @QUERY01 = 'SELECT * FROM ' + @DATABASE_NAME + '.' + @SCHEMA_NAME + 
'.' + @TABLE_NAME
-- + ' WHERE ''' + @KEYWORD + ''' IN (FirstName, LastName)' -- Works                    
+ ' WHERE ''' + @KEYWORD + ''' IN (' + @SUBQUERY01 + ')'

SET @QUERY02 = 'SELECT * FROM ' + @DATABASE_NAME + '.' + @SCHEMA_NAME + 
'.' + @TABLE_NAME
+ ' WHERE ''' + @KEYWORD + ''' IN (' + @SUBQUERY02 + ')'

EXEC (@SUBQUERY01)  -- OK (List of column names, one per row)
EXEC (@SUBQUERY02)  -- OK (List of column names, comma-separated values)

EXEC (@QUERY01)     -- NOK (Empty result)
EXEC (@QUERY02)     -- NOK (Empty result)

Я ожидаю, что сценарий вернет все строки, содержащие ключевое слово в одном из столбцов.Например, следующий код работает нормально:

SELECT * FROM [xxx].[dbo].tblCustomers
WHERE 'Jean' IN (FirstName, LastName)

1 Ответ

4 голосов
/ 13 июня 2019

Это, вероятно, то, что вы ищете.Обратите внимание, что я ограничиваю поиск только столбцами, которые являются строковыми типами, правильно цитирую ваши объекты (используя QUOTENAME) и параметризирую оператор:

DECLARE @Schema sysname,
        @Table sysname,
        @Keyword varchar(100);

DECLARE @SQL nvarchar(MAX);
SET @Schema = N'dbo';
SET @Table = N'icp_yyclient';
SET @Keyword = 'Smith';

SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) + 
           N'FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + NCHAR(13) + NCHAR(10) + 
           N'WHERE @Keyword IN (' + STUFF((SELECT N',' + QUOTENAME(C.[name])
                                           FROM sys.columns c
                                                JOIN sys.tables t ON c.object_id = t.object_id
                                                JOIN sys.schemas s ON t.schema_id = s.schema_id
                                                JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                                            WHERE t.[name] = @Table
                                              AND s.[name] = @Schema
                                              AND ct.[name] IN (N'varchar',N'char',N'nvarchar',N'nchar',N'sysname')
                                            FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,1,N'') + N');';
PRINT @SQL; --Your best friend

EXEC sp_executesql @SQL, N'@Keyword varchar(100)', @Keyword;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...