2017-08-03 130 views
1

我试图通过传递CSV参数来使用sp_executesql。将逗号分隔值传递给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 

我找不到如果更改声明如下什么是错用此方法

+1

'IN'不带参数和'sp_executesql'不会做文本替换。你的第一个查询动态地构造整个查询。第二次尝试将该子句作为参数传递,但不会飞。基本问题在这里描述(https://stackoverflow.com/questions/337704/),以及解决方案(在这种情况下,TVP可能会很好地完成)。 –

+0

[在此处使用子查询中的拆分函数的另一个解决方案](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a8770fa9-6230-41d0-883f-947796db421c/use-parameterized-spexecutesql- with-in-clause?forum = transactsql) – JNevill

+0

@JeroenMostert,我没有意识到这个限制。我尝试使用拆分功能或任何其他解决方法。谢谢! – FLICKER

回答

0

,它会得到结果。 为了获得一些目标,你也可以charindex或拆分。

set @sql = 'EXEC(''select sum(TotalBalanceMTD) from #rptGL where FieldName in (''[email protected]+'') 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+',',','[email protected]+',')>0 group by FieldName 
+0

感谢您的回答,但我的意图是显示sp_executesql与EXEC的用法。 SPLIT也仅在2016年发布(我在2014年)。无论如何感谢您发布答案。我会等待其他人看我能否得到接近我需要的答案 – FLICKER