2017-08-03 128 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