我必须配置一个系统,该系统为我提供了一个输入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。