2017-08-03 3 views
1

sp_executesqlをします。渡すカンマ区切り値は、私は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 

私はあなたが次のような文を変更した場合、それは結果を取得します。この方法

+1

'IN'は、パラメータを取らないと' sp_executesql'は、テキストの置換を行いません。最初のクエリはクエリ全体を動的に構築します。 2番目の引数はパラメータとして句を渡そうとしますが、それは飛ばないでしょう。基本的な問題は解決策と共に(ここでは、TVPがうまくいくかもしれないが)[ここ](https://stackoverflow.com/questions/337704/)で説明されている。 –

+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またはsplitを使用することもできます。

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

関連する問題