1

Ich habe einen Multi-Select-Parameter, der Komma auf der Liste hat und mein Dataset verwendet eine Funktionsaufteilung für meinen Parameter, da es in einem SP ist, so dass meine Where-Klausel aussieht Dieser:SSRS Multiselect-Parameter kann keine Werte mit Komma erfassen

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT VALUE FROM DBO.FnSplit(@ProductDivision,',')) 

und zum Beispiel "SMART-UPS 1,5KVA" und "Back-ups" wurden in den Multi-Select-Parametern aktiviert, die Mehrfachauswahl wird den ersten Wert als zwei verschiedene Werte behandeln, die ist "SMART-UPS 1" und 5KVA“Also in meiner Split-Funktion wird es dieses Ergebnis zeigen.

Row Value 
    1 SMART-UPS 1 
    2 5KVA 
    3 BACK-UPS 

und s "SMART-UPS 1" und "5KVA" waren kein gültiger Wert, ich erhalte die Datensätze nicht unter "SMART-UPS 1,5KVA".

Kann jemand Ideen geben, wie man dieses Problem löst? Jede Antwort wird sehr geschätzt.

+0

könnte ein guter Grund sein, die Werte in einer separaten Tabelle zu speichern mit IDs und übergeben Sie die IDs in Ihrem gespeicherten Proc anstelle der Text-Werte – JamieD77

Antwort

1

Die Antwort auf diese Frage kann ganz einfach sein: Verwenden Sie einfach einen anderen Separator! (In diesem Fall verwende ich „“ aber Sie fast jedes Symbol verwenden könnte, die in Ihrer LOV erscheint nicht

Wenn die Parameter übergeben, stellen Sie den Paramter Wert in den Dataseteigenschaften zu

=Join(Parameters!ProductDivision.Value, ";") 
.

in der SQL-Kodex stellen Sie dann die where-Klausel zu

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT VALUE FROM DBO.FnSplit(@ProductDivision,';')) 

Dies sollte für Sie arbeiten.

+0

Wow, das funktioniert wie ein Zauber! Vielen Dank Mossi! – Aldrin

+0

Kein Problem, ich benutze diese Methode jeden zweiten Tag – Mossi

0

Sie können Parameter als Tabelle Parameter übergeben:

CREATE TABLE #t(ID INT IDENTITY(1,1), CURRENTPRODATT_DIV_NAME VARCHAR(100)); 

INSERT INTO #t(CURRENTPRODATT_DIV_NAME) 
VALUES ('SMART-UPS 1,5KVA'), ('BACK-UPS'); 


DECLARE @t TABLE (val VARCHAR(100)); 
INSERT INTO @t(val) VALUES ('SMART-UPS 1,5KVA'),('BACK-UPS'); 

SELECT * 
FROM #t 
WHERE CURRENTPRODATT_DIV_NAME IN (SELECT val FROM @t); 

LiveDemo

Ausgang:

╔════╦═════════════════════════╗ 
║ ID ║ CURRENTPRODATT_DIV_NAME ║ 
╠════╬═════════════════════════╣ 
║ 1 ║ SMART-UPS 1,5KVA  ║ 
║ 2 ║ BACK-UPS    ║ 
╚════╩═════════════════════════╝ 
+0

Sorry für die Verwirrung. Ich habe mein Beispiel bearbeitet, um klarer mit meinem Problem umzugehen. – Aldrin

0

Also meine Vermutung, dass die Zeichenfolge, die Sie übergeben eine Zeichenfolge wie param , Wert, Parameter, Wert und Sie wollen nur die Werte aus dem stri ng.

Wenn Sie wissen, dass Werte nicht "PARAMETER" sein können. Sie könnten

declare @params varchar(max) = 'PARAMETER1,AAA,PARAMETER2,BBB' 

SELECT VALUE FROM dbo.FnSplit(@params,',') 
WHERE VALUE NOT LIKE 'PARAMETER%' 

Die Ausgabe dieser Abfrage wie diese zu tun ist

---------- 
AAA 
BBB 

Edit:

Falls Sie Parameter als Wert haben, und Sie wissen, dass es immer param sein wird, den Wert , param, Wertstring. Sie könnten einen CTE

declare @params varchar(max) = 'PARAMETER1,AAA,PARAMETER2,BBB'; 
WITH VALUE AS 
(
    SELECT VALUE, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN 
    FROM dbo.FnSplit(@params,',') 
) 

SELECT * FROM VALUE 
WHERE RN % 2 = 0 

So verwenden, was Sie hier tun, können Sie die Zeichenfolge aufgeteilt und die rownumber speichern und Sie wissen auch, dass die Werte immer noch RowNumber haben.

+0

Danke für die Antwort, sorry, wenn mein Beitrag verwirrend ist. Der Wert, den ich bekommen möchte, ist der "PARAMETER1, AAA" in nur 1 String, der nicht in 2 aufgeteilt wird. Ich bearbeite meinen Post und gebe ein anderes Beispiel. – Aldrin

+0

@ Aldreenzy und wie SQL wissen, welche ',' ist gut für die Spaltung und welche nicht. Von dem, was ich verstanden habe, können deine Werte Kommas enthalten, aber es gibt keine Möglichkeit, dass die SQL weiß, was "," ein Spliter ist und was nicht. Entweder verwenden Sie einen anderen Spliter oder Sie kommen mit einem Algorithmus, der Ihnen sagen könnte, dass ein Komma ein Spliter ist oder nicht. – CiucaS

+0

Ja, richtig. Also muss ich wirklich meine Split-Funktion optimieren. Danke für den Hinweis. – Aldrin

1

Sie sollten die Werte in einer separaten Tabelle speichern. Zeigen Sie die Beschreibung und machen Sie den Wert der Listen-Items ihre jeweiligen IDs. Dann haben Sie in Ihrem String-Parameter nie ein Komma.

Wenn das nicht eine Option:

Bevor Sie String Aufbau (in Ihrer Anwendung), ersetzen Sie alle Komma Werte mit etwas, das Sie nicht wissen natürlich erscheinen.

Zum Beispiel, wenn Sie die folgenden Werte ausgewählt haben:

1. SPK,5 
2. Joe 
3. Dave,Smith 

Sie können durch diese Elemente durchlaufen und die Kommas mit so etwas wie zehn Sternchen ersetzen: „********** "

So wäre Ihre letzte Zeichenfolge" SPK ********** 5, Joe, Dave ********** Smith ". Sie möchten auch die Ersatzzeichenfolge als zweiten Parameter übergeben (damit Sie Ihre App ändern können, ohne Ihren SP ändern zu müssen).

Dann können Sie die folgende Logik verwenden:

WHERE [CURRENTPRODATT_DIV_NAME] IN (SELECT REPLACE(VALUE, @SecondParameter, ',') FROM DBO.FnSplit(@ProductDivision,',')) 

Auf diese Weise wird alles richtig aufgeteilt werden, da Sie die Kommas entfernt haben. Wenn Sie dann aus dieser Liste auswählen, ersetzen Sie einfach die lustige Zeichenfolge (in diesem Beispiel zehn Sternchen) durch das ursprüngliche Komma.

Für die Aufzeichnung sollten Sie 100% tun, was ich ursprünglich vorgeschlagen habe. Das ist eine schreckliche Annäherung, aber es wird dich aus dem Stau bringen.

+0

Danke, dass du dir Zeit genommen hast, mit meiner Frage zu antworten. Ich schätze es. Obwohl ich eine viel einfachere Lösung gefunden habe. Es war von Mossis Antwort. – Aldrin

+0

@Aldrin Kein Problem, obwohl seine Antwort die gleiche ist wie meine, hat nur mehr Fehlermöglichkeiten. Von meiner Antwort "ersetzen Sie alle Komma-Werte durch etwas, von dem Sie wissen, dass es nicht natürlich erscheint". Die zehn Sterne waren ein Beispiel. Wenn ein Semikolon nicht natürlich erscheint, ist es dasselbe. Sie sollten es jedoch lieber als Parameter übergeben, denn wenn in Ihrer Liste eine Option mit einem Semikolon enthalten ist (wenn dies Ihr ausgewähltes Trennzeichen ist), müssten Sie sowohl die App als auch den SP ändern, anstatt nur eines . Viel Glück für Sie, egal. –