Übergabe von Werten an Funktionen

hoefi

Neuer Benutzer
Beiträge
4
Hallo,

folgende Anweisung funktioniert einwandfrei: "select * from makt where matnr IN ('000000000004499301', '000000000006548261').

Nun möchte ich die Abfrage zu einer Funktion machen:

CREATE OR ALTER FUNCTION testMakt(@matnr varchar(1000))
RETURNS TABLE
AS
RETURN
select * from makt
where matnr IN (@matnr)

Wie muss ich die Funktion aufrufen, dass die Übergabewerte mit dem IN korrekt arbeitet?
Ich hoffte, dass ein select * from testMakt('000000000004499301', '000000000006548261') funktioniert, tut es aber nicht. Es ergibt eine leere Ergebnissmenge.
 
Werbung:
Werte, welche man an die Funktion übergibt werden auch "Parameter" genannt, diese werden generell in die Klammer nach dem Funktionen-Namen geschrieben.

du benötigst bei deiner Abfrage, wie ich denke, 2 Parameter.
Wenn du nur einen Parameter möchtest, musst du in der Abfrage den oberen Wert addieren oder den unteren subtrahieren.

ich erstelle schnell eine Tabelle mit einer passenden Abfrage:
Code:
create table tabelle(spalte integer);
insert into tabelle values (1), (2), (3), (4);

Code:
select * from tabelle where spalte in (2, 3);

Ergebnis:
Code:
2
3

Hoffe, konnte dir helfen ;)

EDIT:
Funktion erstellen vergessen, ...

Code:
create function abfrage(x int, y int) returns table(x int, y int) as $$ select * from tabelle where spalte in (x, y); $$ language sql;

jetzt aber :D
 
Hallo, danke Dir.

Ich muss leider an die Funktion n beliebig viele Werte übergeben müssen können.
Das Beispiel hat nur zwei enthalten, es könnten aber auch hunderte sein.
Das muss dynamisch sein.
Gibt es dafür einen Weg?
 
vl. meinst du das mit einem Sub-Select ?

Code:
create table eins(id int);
insert into eins values (1), (2), (3), (4), (5), (6), (7), (8), (9);

Hier die Abfrage:
Code:
select id from eins where id in (select 1 union select 2 union select 3 union ......)

Ergebnis:
Code:
1
2
3

das ist eine Möglichkeit, wie man mehrere Werte im "in" einsetzen kann.

EDIT:
Eine "In"-Bedingung muss nicht immer aus 2 Werten bestimmt sein, es ist, wie oben genannt, mit einem "Sub-Select" müglich (einer Unter-Abfrage), welche alleine stehen kann.

sieht für mich nach einer Schleife aus (?), bin leider nicht allzu geschult in MS SQL ;) *sorry*
 
ich muss eine Funktion haben, die ich beleibig vielen Werten füttern kann.
Der Weg von Kampfgummibaerlie klingt schon mal vielversprechend, da werde ich mal mit rumspielen
 
Das Problem scheint mir die Übergabe von mehreren Kriterien an 1 Parameter zu sein.
Ändere doch bitte mal die Funktion und den Aufruf ab.

SQL:
CREATE OR ALTER FUNCTION testMakt(@matnr varchar(1000))
RETURNS TABLE
AS
RETURN
select * from makt
where matnr IN (select * from string_splitt(@matnr, ','))

select * from testMakt('000000000004499301, 000000000006548261')

Der Parameter besteht dann nur aus 1 String und wird von String_Splitt wieder zerlegt.
Sollte ab Kompatibilitätsmodus 120 funktionieren.
 
Werbung:
In jedem Fall muss der String aus mehreren Parametern innerhalb der Funktion wieder zerlegt werden. Siehe Lösung von @MDDaniel

Alternativ ginge noch dynamisches SQL, wo der String zusammengebaut und dann mit EXEC() ausgeführt wird, oder die Übergabe nicht als VARCHAR sondern in Form eines Arrays. Die Lösung von @MDDaniel und dynamisches SQL haben beide möglicherweise den Nachteil das bei entsprechend vielen (und langen) Parametern die Variable zu klein wird.

Der Nachteil an Arrays ist, das es sie nicht gibt :) Arrays sind in MSSQL Tabellen, die kann man auch temporär anlegen. Es gibt wirklich viele Beiträge, die sich mit sowas befassen:
 
Zurück
Oben