EXE C работает со значением переменной, но не самой переменной - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь запустить серию динамически создаваемых операторов sql, которые хранятся в таблице с помощью операторов exe c. При устранении неполадок я упростил процесс до простой попытки выполнения одного оператора, и я столкнулся с проблемой, которую я не совсем понимаю, как ее понять.

По сути, у меня есть объявленный nvarchar ( max) переменная, @str_query. Он инициализирован действительным оператором sql select из моей таблицы операторов. Попытка exe c (@ str_query) возвращает ошибку «Неверный синтаксис» (сообщение 102) и переходит к выводу оператора в виде строки. Когда я печатаю (@str_query) и копирую эту же строку в exe c () Тем не менее, он работает, как и ожидалось. Затем я создал отдельную переменную nvarchar (max) @test_var и явно задал ей ту же строку. Запуск exe c (@ test_var) работает, как и ожидалось, запустив оператор sql, хранящийся в строка. Если для @test_var задано значение @str_query, а затем запустить exe c (@ test_var), это также приведет к ошибке.

По сути, exe c () работает с явным значением переменной, но не с самой переменной, несмотря на то, что значение переменной является строкой stati c, выходящей из таблицы. Любая помощь будет полезна для работы с переменной. Спасибо!

Код ниже:

DECLARE @Queries TABLE (ID INT IDENTITY(1,1), ColumnName VARCHAR(100), TableName VARCHAR(100),SQLScript VARCHAR(MAX))
DECLARE @Results TABLE (TableName VARCHAR(100), ColumnName VARCHAR(100), Result VARCHAR(MAX))
DECLARE @STR_QUERY NVARCHAR(MAX)
DECLARE @StartLoop INT
DECLARE @EndLoop INT
declare @searchValue varchar(max)
set @searchValue = 'search'
DECLARE @searchColumn VARCHAR(MAX)
set @searchColumn = 'addr_line_1'

INSERT INTO @Queries(ColumnName,TableName,SQLScript)
SELECT
    COLUMN_NAME AS 'ColumnName'
,   TABLE_NAME AS 'TableName'
,   'select '''''+TABLE_NAME+''''' as ''''TABLENAME'''','''''+COLUMN_NAME+''''' as ''''COLUMNNAME'''','+COLUMN_NAME+' as ''''RESULT'''' from '+TABLE_NAME+' where '+COLUMN_NAME+' like ''''%'+@searchValue+'%''''' as 'Statement'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%'+@searchColumn+'%'

SELECT @EndLoop = MAX(ID), @StartLoop = MIN(ID)
FROM @Queries

set @STR_QUERY = (SELECT top(1) SQLScript FROM @Queries WHERE ID = @StartLoop)
set @STR_QUERY = ''''+@STR_QUERY+''''
print(@STR_QUERY) -- prints 'select ''Table1'' as ''TABLENAME'',''ADDR_LINE_1'' as ''COLUMNNAME'',ADDR_LINE_1 as ''RESULT'' from Table1 where ADDR_LINE_1 like ''%search%'''
exec('select ''Table1'' as ''TABLENAME'',''ADDR_LINE_1'' as ''COLUMNNAME'',ADDR_LINE_1 as ''RESULT'' from Table1 where ADDR_LINE_1 like ''%search%''') --works
exec(@STR_QUERY) -- error
declare @test_var nvarchar(max)
set @test_var = 'select ''Table1'' as ''TABLENAME'',''ADDR_LINE_1'' as ''COLUMNNAME'',ADDR_LINE_1 as ''RESULT'' from Table1 where ADDR_LINE_1 like ''%search%'''
exec(@test_var) -- works
set @test_var = @STR_QUERY
exec(@test_var) --error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...