【问题标题】:Passing comma separated values to sp_executesql将逗号分隔值传递给 sp_executesql
【发布时间】:2023-03-30 12:24:01
【问题描述】:

我正在尝试通过传递 CSV 参数来使用 sp_executesql。

当我通过传递构造字符串使用 EXEC 时,它会返回一些数据

declare @Accts nvarchar(100) = 'IntYTD,TotalIncome,PayoffYTD'
declare @sql nvarchar(max)
set @sql = 'select sum(TotalBalanceMTD) from rptGL where FieldName in (''' + replace(@Accts, ',', ''',''') + ''') group by FieldName'
exec (@sql)

但是当我使用 sp_executesql 并将 @Accts 作为参数传递时,它不返回任何数据。

set @sql = 'select sum(TotalBalanceMTD) from rptGL where FieldName in (@values) group by FieldName'
declare @v nvarchar(max) = '''' + replace(@Accts, ',', ''',''') + ''''
exec sp_executesql @sql, N'@values varchar(max)', @values = @v

我找不到这个方法有什么问题

【问题讨论】:

  • IN 不带参数,sp_executesql 不进行文本替换。您的第一个查询动态构建整个查询。第二个尝试将子句作为参数传递,但这不会飞。 here 描述了基本问题以及解决方案(在这种情况下,TVP 可能会做得很好)。
  • @JeroenMostert,我不知道这个限制。我尝试使用拆分功能或任何其他解决方法。谢谢!

标签: sql-server sql-server-2014 dynamic-sql sp-executesql


【解决方案1】:

如果您将语句更改如下,它将得到结果。 为了得到一些目标,你也可以charindex或split。

set @sql = 'EXEC(''select sum(TotalBalanceMTD) from #rptGL where    FieldName in (''+@values+'') group by FieldName'')'
declare @v nvarchar(max) = '''' + replace(@Accts, ',', ''',''') + ''''
exec sp_executesql @sql, N'@values varchar(max)', @values = @v

CHARINDEX:

 declare @Accts nvarchar(100) = 'IntYTD,TotalIncome,PayoffYTD'
 select sum(TotalBalanceMTD) from #rptGL where charindex(','+FieldName+',',','+@Accts+',')>0 group by FieldName

【讨论】:

  • 感谢您的回答,但我的意图是展示 sp_executesql 与 EXEC 的用法。 SPLIT 也仅在 2016 年可用(我在 2014 年)。无论如何,感谢您发布答案。我会等待其他人,看看我是否能得到接近我需要的答案
猜你喜欢
  • 2015-01-11
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2010-10-27
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多