2017-08-03 2 views
1

Ich versuche sp_executesql zu verwenden, indem ich CSV-Parameter übergebe.Übergabe von durch Komma getrennten Werten an sp_executesql

Wenn ich exec durch konstruierte String übergeben, gibt sie mir ein paar Daten

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) 

Aber wenn ich sp_executesql verwenden und die @Accts als Parameter übergeben werden, gibt es keine Daten.

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 

Ich kann nicht finden, was mit dieser Methode falsch ist

+1

'IN' keine Parameter übernehmen und' sp_executesql' nicht textlichen Austausch tun. Ihre erste Abfrage erstellt die gesamte Abfrage dynamisch. Der zweite Versuch, die Klausel als Parameter zu übergeben, wird jedoch nicht fliegen. Das grundlegende Problem wird beschrieben [hier] (https://stackoverflow.com/questions/337704/), zusammen mit Lösungen (in diesem Fall könnte ein TVP gut tun). –

+0

[Eine andere Lösung, die hier eine Unterfunktion in einer Unterabfrage verwendet] (https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a8770fa9-6230-41d0-883f-947796db421c/use-parameterized-sexecutesql- with-in-clause? forum = transactsql) – JNevill

+0

@ JeroenMostert, mir war die Einschränkung nicht bewusst. Ich versuche, Split-Funktion oder eine andere Problemumgehung zu verwenden. Vielen Dank! – FLICKER

Antwort

0

Wenn Sie die Anweisung wie folgt zu ändern, wird es Ergebnis. Für etwas objektives können Sie auch charindex oder splitten.

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

Danke für die Antwort, aber meine Absicht zeigt die Verwendung von sp_executesql im Vergleich zu EXEC. Auch SPLIT ist nur verfügbar auf 2016 (ich bin auf 2014). Danke, dass du trotzdem eine Antwort geschrieben hast. Ich werde auf andere warten, um zu sehen, ob ich eine Antwort bekommen kann, die meinem Bedarf entspricht – FLICKER

Verwandte Themen