动态 SQL 出错,可能是由于撇号 (SQL SERVER)

Error with Dynamic SQL, maybe due to apostrophe (SQL SERVER)

请帮我找出错误。我认为这是由于撇号,但我不知道如何更正。

我的代码返回错误:

Msg 156, Level 15, State 1, Line 3 Incorrect syntax near the keyword 'or'.

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;

您忘记在动态 SQL 字符串中添加字符串定界引号。

您的代码(重复了几次):

' .... [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+' .... '