在具有硬连线预分配变量的系统上配置 SQL Server 动态 SQL"IN 子句"



我必须配置一个系统,该系统为我提供了一个输入SQL语句的区域。这些语句可以具有非SQL绑定变量。需要注意的是,我们不能修改正在配置的系统。

因此,系统为我们提供了{0}{1}{2}开关,同一系统将替换为以下执行:

  • {0}->string1
  • {1}->string2
  • {2}->'string3','string4','string5'(或根据需要的数量)

我们要配置的查询如下:

Select col1 
from table1 
where col2 = '{0}' and col3 = '{1}' and col4 in ({2})

它在执行时产生这个:

Select col1 
from table1 
where col2 = 'string1' and col3 = 'string2' 
  and col4 in ('string3', 'string4', 'string5')

在一个新的需求中,我们必须使用不同的列来通过这3个参数进行过滤。所以最初的想法是使用动态SQL。

现在问题出在{2}上,因为我们无法以足够好的格式从配置框中截取其值。

我们尝试使用:

declare @mylist
set @mylist = {2}

但这导致了错误的陈述:

declare @mylist
set @mylist = 'string3','string4','string5'

另一种尝试是:

declare @sql
set @sql = 'Select '+ @myCol1 +' from table1 where '+ @myCol2 +' = '''{0}''' and '+ @myCol3 +' = '''{1}''' and '+ @myCol4 +' in ({2})'
exec sp_executesql @sql

但这会导致@sql内部出现以下错误语句(错误发生在来自{2}的非加倍'上:

'Select col1 from table1 where col2 = ''string1'' and col3 = ''string2'' and col4 in ('string3','string4','string5')'

我想做的事情有其他选择吗?

我真的很感激你的帮助。

您可以尝试扰乱SET QUOTED_IDENTIFIER,例如:

SET QUOTED_IDENTIFIER OFF
declare @mylist varchar(200)
set @mylist = "{2}"
SET QUOTED_IDENTIFIER ON
select @mylist /* ''string3'',''string4'',''string5'' */

新字符串应该可用于您提供的动态SQL查询。看看这个Fiddle。

最新更新