【问题标题】:Error with Dynamic SQL, maybe due to apostrophe (SQL SERVER)动态 SQL 出错,可能是由于撇号 (SQL SERVER)
【发布时间】:2020-01-09 09:17:58
【问题描述】:

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

我的代码返回错误:

消息 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;

【问题讨论】:

标签: sql-server tsql dynamic-sql


【解决方案1】:

您忘记在动态 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+' .... '

【讨论】:

  • 使用@policy作为适当的参数查询字符串即policy1 like @policy or policy2 like @policy ...并将值作为参数值传递给sp_executesql会更容易和更安全.
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2013-02-20
  • 1970-01-01
  • 2014-11-07
  • 2021-03-28
相关资源
最近更新 更多