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))
ENDDas 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.
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.
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.
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.
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.
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 :)
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).
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.