Ошибка с Dynami c SQL, возможно, из-за апострофа (SQL SERVER) - PullRequest
0 голосов
/ 09 января 2020

Пожалуйста, помогите мне найти ошибки. Я думаю, что это из-за апострофа, но я не знаю, как исправить.

Мой код вернул ошибку:

Сообщение 156, Уровень 15, Состояние 1, Строка 3 Неверный синтаксис рядом с ключевое слово "или".

Use YEAR_TO_DATE;

Declare @policy NVARCHAR(MAX);
Declare @account_list NVARCHAR(MAX);
Declare @sql NVARCHAR(MAX);
Set @policy ='TTY%';
Set @account_list='18000,19000';

Set @sql = 
'Select
case
when [Debit_Account] in ('+@account_list+') and ([policy1] like '+@policy+' or [policy2] like '+@policy+' or [policy3] like '+@policy+') then -[Amount]
when [Credit_Account] in ('+@account_list+') and ([policy1] like '+@policy+' or [policy2] like '+@policy+' or [policy2] like '+@policy+') then [Amount]
else 0
end as [Amount]
from CTGS 
where [Debit_Account] in ('+@account_list+') or [Credit_Account] in ('+@account_list+')';

EXEC sp_executesql @sql;

1 Ответ

1 голос
/ 09 января 2020

Вы забыли добавить кавычки-разделители строк в вашу динамику c SQL string.

Ваш код ( повторяется несколько раз ):

' .... [policy1] like '+@policy+' .... '

Если вы добавите это:

DECLARE @qt VARCHAR(1) = CHAR(39)

Тогда вы можете решить проблему, используя это ( также несколько раз ):

' .... [policy1] like '+@qt+@policy+@qt+' .... '

Обратите внимание, что вместо @qt вы также можете использовать '' (две одинарные кавычки) непосредственно в ваших строках, где это необходимо, но, по моему мнению, это часто приводит к трудно читаемому коду.

Также обратите внимание, что если @policy может сама по себе также содержит одну или несколько кавычек, вам придется избегать тех с REPLACE следующим образом:

' .... [policy1] like '+@qt + REPLACE(@policy, @qt, @qt+@qt) + @qt+' .... '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...