Я хочу иметь возможность динамически искать определенное ключевое слово во всех столбцах таблицы.Сценарий должен состоять в том, чтобы изменить только ключевое слово и имя таблицы без необходимости знать, каковы все столбцы таблицы.
Это означает, что следующий код не является удовлетворительным решением:
[...] 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)