Hi,
ich wollte hier noch einmal etwas ergänzen. Ich habe zu diesem Thema nämlich auch durchaus einen konkreten Fall:
In einem Bericht auf dem Report Server sollen Umsätze von Kunden ausgewertet werden. Die Kunden können über einen Mehrfach-Parameter für die Ausewrtung ausgewählt werden.
Wer das nicht kenn, hier kurz erklärt: in einer Liste werden alle auswählbaren Kunden angeueigt. Über ein Häkchen, das an einen Kunden angehängt ist, kann dieser an- oder abgewählt werden.
Der Berichtsserver verwaltet diese Mehrfach-Parameter als Array. In diesem Array stehen dann die IDs der ausgewählten Kunden.
Hier kommt nun das Dilemma: die Auswertung erfolgt auf einem MS SQL-Server, der ja bekanntlich keine mehrfachen Einträge in einem Parameter verwalten kann.
Hier helfe ich mir nun, indem ich das Array, das im Berichtparameter verwaltet wird, zu einem gesamten String joine.
In deisem String werden alle Kunden-IDs mit Semikolon getrenn hintereinander aufgeführt.
Diesen String übergebe ich an die Prozedur, mit der die Datenabfrage vorgenommen wird.
Eine ID kann ich aber nicht mit einem LIKE vergleichen. Hier benötige ich eine eindeutige 1:1 Beziehung.
Da ich persönlich nun ein fauler Hund bin und dazu auch noch sehr schnell die Übersicht bei komplexeren String-Operationen verliere, habe ich mir mit einer Umwandlung in XML geholfen.
Im Folgenden seht ihr nun meinen Code (oder Kot?) mit dem ich eine zusätzliche Tabelle für eine direkten Vergleich zu Kundenauswahl bereitstelle:
Code:
DECLARE @parKD_ID varchar(max)
SET @parKD_ID='1000;2000;3000;4000'
-- Deklaration der Vergleichs-Tabelle
CREATE TABLE #ID
( NR int IDENTITY(1,1),
KD_ID int
)
-- Umwandlung des Parameter-Strings in XML-Format
DECLARE @X as xml
WHILE RIGHT(@parKD_ID,1)=';'
BEGIN
SET @parKD_ID = LEFT(@parKD_ID, LEN(@parKD_ID)-1)
END
SET @parKD_ID='<HKey><KND>'+REPLACE(@parKD_ID,';','</KND><KND>')+'</KND></HKey>'
SET @X = CAST(@parKD_ID as xml)
-- Eintrag der einzelnen IDs in die Vergleichs-Tabelle
INSERT INTO #ID (KD_ID)
SELECT result.value('/KND[1]', 'int')
FROM (
SELECT T.c.query('.') AS result
FROM @x.nodes('/HKey/KND') T(c)) X
-- Dann der Join der Vergleichs-Tabelle auf die Kunden-Tabelle, um nur die gewählten Kunden auszuwerten
SELECT ...
FROM dbo.Kunden K
INNER JOIN #ID I
ON K.KD_ID=I.KD_ID
-- Beispiel-Ende
DROP TABLE #ID
Ich gebe zu, die XML-Geschichte sieht zunächst etwas undurchsichtig aus, ist aber (aus meiner Sicht) einfacher als eine Schleife zu programmieren,
mit der dann der String mit Kundennummern bearbeitet wird. Ach ja - und etwas schneller ist es auch, gerade wil keine Schleife drin ist.
Viele Grüße,
Tommi