“配置SQL Server动态SQL”;在第条中;在具有硬连线预分配变量的系统上

“配置SQL Server动态SQL”;在第条中;在具有硬连线预分配变量的系统上,sql,sql-server,Sql,Sql Server,我必须配置一个为我提供输入SQL语句区域的系统。这些语句可以具有非SQL绑定变量。请务必注意,我们无法修改正在配置的系统 因此,系统为我们提供了{0},{1},{2},同一系统将替换为以下执行: {0}-->string1 {1}-->string2 {2}-->'string3'、'string4'、'string5'(或根据需要增加) 我们将配置的查询如下所示: Select col1 from table1 where col2 = '{0}' and col3 = '{1}' a

我必须配置一个为我提供输入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 OFF

declare @mylist varchar(200)
set @mylist = "{2}"

SET QUOTED_IDENTIFIER ON

select @mylist /* ''string3'',''string4'',''string5'' */

新字符串应可用于您提供的动态SQL查询。请参见。

它看起来像.NET字符串格式占位符,但我可能错了-因此,如果您的语句包含多个相同编号的占位符(例如,
其中col4 IN({2})或col5 IN({2})
),它们是否都会被相同的列表替换?还有,我们可能要处理多少不同的列?(这是一组容易列举的可能性)?这个问题很有趣…
QUOTED_IDENTIFIER
是我的答案!但为了改进你的答案,我建议你删除
replace
语句。只需将
set@mylist
行替换为
set@mylist=“{2}”
在您的回答中,我的问题得到了解决,谢谢!很高兴我能提供帮助。我删除了回答中的
替换。