Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Übergeben von Parametern mit mehreren Werten in SSRS an die gespeicherte Prozedur

Richtig, ich muss Ihnen zuerst etwas Hintergrundwissen geben.

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

  'value1,value2,value3'

Um Werte in einem String mit IN zu überprüfen Operator benötigen wir Zeichenfolgen, die mit Kommas verkettet sind, etwa so ....

  'value1','value2','value3'

Ihr Proc

Wenn Sie jetzt Werte explizit in Ihren Prozess einfügen, fügt er mehrere Werte in Ihre Tabelle ein.

  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 ob Sie innerhalb Ihrer Prozedur eine Anweisung wie

ausführen
SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)

Wenn Sie andererseits versuchen, mithilfe von SSRS-Berichtsparametern in die Tabelle einzufügen, fügt Ihre Tabelle Werte wie

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

Lösung

Erstellen von TVP In dieser Situation hilft es nicht wirklich, was ich mache, ist dbo.Split() zu verwenden Funktion innerhalb meiner Prozedur.

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

Sobald Sie diese Aufteilungsfunktion erstellt haben, verwenden Sie diese Funktion einfach in Ihrer Prozedurdefinition. Sie benötigen dann nicht einmal die Tabellenwertparameter.

Etwas in der Art...

  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       )