it-swarm.com.de

Übergeben mehrerer Werteparameter in SSRS an gespeicherte Prozeduren

Ich versuche, einen Parameterwert mit mehreren Werten an einen Tabellentypparameter in einer gespeicherten Prozedur von SQL Server 2012 zu übergeben. Ich füge diesen Code in den Datensatz von SSRS ein:

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES (@pm_ChooseClinics)
EXEC sp_Skillset_Summary_With_Callbacks_Report @mylist, @pm_ChooseInterval, @pm_StartDateTime, @pm_EndDateTime

clinic_list_tbltype ist ein Tabellentyp, den ich mit einem varchar (50) -Feld namens "n" erstellt habe. Ich kann diese gespeicherte Prozedur von SSMS o.k aufrufen. so (und es kommt sehr schnell zurück):

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES ('clinicA'), ('clinicB')
EXEC sp_Skillset_Summary_With_Callbacks_Report  @mylist, 'Daily', '6/3/2014', '6/9/2014'

Ich kann in SSRS nur für eine Klinik laufen (aber sehr langsam), aber wenn ich mehr als eine probiere, gibt es einen Fehler, der das sagt 

die INSERT-Anweisung enthält weniger Spalten als die in der Values-Klausel angegebenen Werte

. Es läuft zwar nur für ein Clnic, aber es dauert sehr lange, verglichen mit der Abfrage in SSMS. Wie 2 Minuten vs. 1 Sekunde. Muss sein, weil ich vorbeikomme ("ClinicA", "ClinicB") statt ("ClinicA"), ("ClinicB"). 

Wie macht man?

10
urbanmojo

Richtig, ich muss dir erstmal einen Hintergrund geben. 

Wenn Sie zulassen, dass der SSRS-Parameter mehrere Werte auswählt, erstellt die Auswahl mehrerer Werte eine durch Kommas getrennte Wertzeichenfolge als eine Zeichenfolge 

  'value1,value2,value3'

Um die Werte in einem String mit dem Operator IN zu überprüfen, benötigen wir Strings, die mit Kommas wie dem folgenden verknüpft sind.

  'value1','value2','value3'

Dein Proc

Wenn Sie nun explizit Werte einfügen, werden in Ihrer proc mehrere Werte in die Tabelle eingefügt.

  INSERT INTO Table_Value_Param
  VALUES ('value1'),       --<-- 1st value/Row
         ('value2'),       --<-- 2nd Value/Row
         ('value3')        --<-- 3rd Value/Row

und dies gibt Ihnen die erwarteten Ergebnisse zurück, als würden Sie innerhalb Ihrer Prozedur eine Anweisung wie ausführen 

SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)

Wenn Sie dagegen versuchen, mithilfe des SSRS-Berichts "Parameter" in eine Tabelle einzufügen, fügt die Tabelle einen Wert ein 

  INSERT INTO Table_Value_Param
  VALUES ('value1,value2,value3')   --<-- One Row/Value containing all the values comma separated

Lösung

Das Erstellen von TVP in dieser Situation hilft nicht wirklich. Was ich mache, ist die Funktion dbo.Split() in meiner Prozedur.

Sie können viele Definitionen für die Split-Funktion online finden, ein paar coole finden Sie hier Split Function equivalent in tsql?

Wenn Sie diese Split-Funktion erstellt haben, verwenden Sie diese Funktion einfach in Ihrer Prozedurdefinition. Sie benötigen dann nicht einmal die Parameter für den Tabellenwert. 

Etwas wie das...

  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       ) 
7
M.Ali
declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max) 
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+'''' 
select @Vendors
0
Voucik