Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

T-SQL gespeicherte Prozedur mit IN Operator

Begonnen von Xoar, Juli 05, 2021, 21:47:00

⏪ vorheriges - nächstes ⏩

Xoar

Hallo SQL Profis,

habe ein Problem bei dem ich nicht weiter komme...

Ich habe mir eine gespeicherte Prozedur im MS SQL Server erstellt die einen Parameter erwartet.
Dieser Parameter soll ansich eine Liste mit Werten übergeben. Es soll wie in Access über den IN Operator gefiltert werden.
...WHERE UntersuchungID IN (@Liste)...
Leider klappt die Filterung nur bei einem Einzelwert (1), nicht aber bei einer Liste wie folgt (1,2,3)
Da kommt immer die Fehlermeldung
ZitatFehler beim Konvertieren des nvarchar-Werts "1,2,3" in den int-Datentyp.

Ich habe den Parameter als nvarchar(100) definiert, muss der Datentyp evtl. was anderes sein?


Hier mal der ganze SQL Code stark gekürzt, wegen der Übersichtlichkeit

ALTER PROCEDURE [dbo].[spUntersuchungenUebersichtFiltern]
-- Add the parameters for the stored procedure here
@Liste nvarchar(100)

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    -- Insert statements for procedure here
SELECT dbo.tblMitarbeiter.Vorname, dbo.tblMitarbeiter.Nachname, dbo.tblMitarbeiterUntersuchungen.UntersuchungID
FROM dbo.tblMitarbeiter RIGHT
OUTER JOIN
dbo.tblMitarbeiterUntersuchungen ON dbo.tblMitarbeiter.MitarbeiterID = dbo.tblMitarbeiterUntersuchungen.FMitarbeiterID
WHERE dbo.tblMitarbeiterUntersuchungen.IstUntersuchung = 1 and dbo.tblMitarbeiterUntersuchungen.UntersuchungID IN (@Liste))
END

Das ganze möchte ich dann über ne Path Through Abfrage an ein Form binden. Die PT ändere ich dann je Filterwert mit VBA. Das hab ich woanders schon gemacht, allerdings nur mit einem Einzelparameter.
  •  

markusxy

Eine direkte Zuweisung kann nicht funktionieren.

Das Thema wurde ja schon ziemlich oft behandelt.

Das Prinzip: Der String wird zerlegt und die einzelnen Werte werden z.B. in eine Tabellenvariable eingefügt und auf die wird dann gejoint oder per In Operator ausgewertet.

Die String_Splitt Funktion, erstellt auch so eine Ansicht. Schaus dir mal an, falls du es nicht lösen kannst kann ich dir einen Vorschlag machen.
  •  

Xoar

Moin,

hab mal nach der Funktion gegoogelt.

SELECT ProductId, Name, Tags 
FROM Product 
JOIN STRING_SPLIT('1,2,3',',')
    ON value = ProductId;

Das Beispiel hab ich gefunden.

Also packe ich nach dem letzten Join von mir sowas wie

JOIN STRING_SPLIT(@Liste)
 ON value = UntersuchungID

oder muss der Parameter vorher in eine Liste aufgeteilt werden?

Da wüsste ich jetzt nicht wie das in T-SQL geht. 
  •  

markusxy

Zitat von: Xoar am Juli 06, 2021, 15:28:29Also packe ich nach dem letzten Join von mir sowas wie

JOIN STRING_SPLIT(@Liste)
 ON value = UntersuchungID


oder muss der Parameter vorher in eine Liste aufgeteilt werden?

Die Funktion macht aus dem String eine Liste.
Vielleicht solltest du das mal testen, statt zu fragen.


Zitat von: Xoar am Juli 06, 2021, 15:28:29Da wüsste ich jetzt nicht wie das in T-SQL geht. 

Das ist doch bereits TSQL.

Ob du das mit einem Join, Apply oder IN löst spielt keine Rolle.
Wenn du die Logik verstehst, dann nimmst du immer das was grad optimal passt.

Und bitte, lern mit einem Tabellen Alias zu arbeiten.
Tabellennahmen verwenden nur die Leute in Access, die nicht wissen wie man den Namen per Funktion mit einem Alias ersetzt - grauenvoll.

Hast du dir die Beispiele in der Online Hilfe angesehen?
Wenn du die testest, solltest du das Prinzip verstehen - mehr braucht man nicht - das sollte immer die erste Adresse sein.
  •  

Xoar

Moin,

ich teste das am Donnerstag auf der Arbeit. BiS dahin hab ich frei 🤗

Das Beispiel oben kam ja aus der OH.

Ja Tabellen Aliase muss ich mir noch angewöhnen. Hilft der Lesbarkeit.

Danke bis dahin.
  •  

Xoar

So habs testen können

musste den  Datentyp auf nchar(100) ändern
@Liste nchar(100)
und den join Teil mit den Funktionsparametern erweitern.

JOIN string_split(@Liste,',') on value = UntersuchungID
Danke für den Tipp mit der Funktion :)
  •  

markusxy

Zitat von: Xoar am Juli 08, 2021, 18:27:16musste den  Datentyp auf nchar(100) ändern

Also ich sag mal gut das es funktioniert.

NChar ist sicher nicht erforderlich siehe Hilfe:

ZitatIs an expression of any character type (for example, nvarchar, varchar, nchar, or char).

  •  

Xoar

#7
Ja hab ich auch gelesen, aber bei nvarchar hat er immer gesagt, Fehler beim Umwandeln in den Datentyp int.

Warum auch immer 🤷🏻‍♂️

Ziel erreicht, alles gut.
  •