MSSQL Parameter übergeben für in()
Hallo Admins,
gibt es eine Möglichkeit folgenden Parameter als Variable zu übergeben?
declare @inummer int
set @inummer = 100,105,120
where nNR in (@iNummer)
was dem hier entsprechen sollte
where NR in (100,105,120)
Es sind immer unterschiedliche viele Nummern weshalb die Variablen einzeln zu definieren nicht möglich ist. Danke für eure Hilfe.
Gruß Joni
gibt es eine Möglichkeit folgenden Parameter als Variable zu übergeben?
declare @inummer int
set @inummer = 100,105,120
where nNR in (@iNummer)
was dem hier entsprechen sollte
where NR in (100,105,120)
Es sind immer unterschiedliche viele Nummern weshalb die Variablen einzeln zu definieren nicht möglich ist. Danke für eure Hilfe.
Gruß Joni
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 178562
Url: https://administrator.de/forum/mssql-parameter-uebergeben-fuer-in-178562.html
Ausgedruckt am: 23.12.2024 um 11:12 Uhr
15 Kommentare
Neuester Kommentar
Hallo Joni,
dynamisches SQL und temporäre Tabellen stehen in T-SQL-Funktionen nicht zur Verfügung, das ist richtig.
Dann gäbe es zwei Möglichkeiten:
1. Eine Tabelle, die zwar nicht temporär angelegt ist, aber temporär genutzt wird. Damit sich die einzelnen Anwender nicht ins Gehege kommen, legt man dann eine Spalte an, über die sie unterschieden werden können, z.B. den Benutzernamen, Rechnernamen oder sonstwas eindeutiges. Da käme dann je Nr ein Datensatz rein und darauf könnte dann in der Funktion zugegriffen werden.
2. Am Anfang der Funktion wird die Liste mit Hilfe von charindex und substring zerlegt und in eine Tabellenvariable geschrieben. Die gehen auch in Funktionen. Und darauf kann dann zugegriffen werden, wie auf ganz normale Tabellen.
Gruß, Mad Max
dynamisches SQL und temporäre Tabellen stehen in T-SQL-Funktionen nicht zur Verfügung, das ist richtig.
Dann gäbe es zwei Möglichkeiten:
1. Eine Tabelle, die zwar nicht temporär angelegt ist, aber temporär genutzt wird. Damit sich die einzelnen Anwender nicht ins Gehege kommen, legt man dann eine Spalte an, über die sie unterschieden werden können, z.B. den Benutzernamen, Rechnernamen oder sonstwas eindeutiges. Da käme dann je Nr ein Datensatz rein und darauf könnte dann in der Funktion zugegriffen werden.
2. Am Anfang der Funktion wird die Liste mit Hilfe von charindex und substring zerlegt und in eine Tabellenvariable geschrieben. Die gehen auch in Funktionen. Und darauf kann dann zugegriffen werden, wie auf ganz normale Tabellen.
Gruß, Mad Max
Hallo Joni,
wer da Eure Funktion zusammengebastelt hat, sollte eigentlich auch wissen, daß es in T-SQL auch sowas wie Schleifen und andere Sprachkostrukte gibt
Egal, jedenfalls könnte das dann so aussehen:
Gruß, Mad Max
wer da Eure Funktion zusammengebastelt hat, sollte eigentlich auch wissen, daß es in T-SQL auch sowas wie Schleifen und andere Sprachkostrukte gibt
Egal, jedenfalls könnte das dann so aussehen:
create function fn_test (@NrListe varchar (max)) returns int as
begin
declare @Nr int, @pos1 int, @pos2 int, @Ende bit
declare @NrTab table (Nr int)
-- Liste zerlegen in einzelne Werte und nach @NrTab schreiben
if len (IsNull (@NrListe, '')) > 0
begin
select @pos2 = 0, @Ende = 0
while 1 = 1
begin
select @pos1 = @pos2 + 1
select @pos2 = charindex (',', @NrListe, @pos1)
if @pos2 = 0 select @pos2 = len (@NrListe) + 1, @Ende = 1
select @Nr = convert (int, substring (@NrListe, @pos1, @pos2 - @pos1))
insert into @NrTab (Nr) values (@Nr)
if @Ende = 1 break
end
end
-- ab hier kann dann auf eine gefuellte Tabelle @NrTab zugeriffen werden
select @Nr = count (*) from @NrTab
return @Nr
end
go
select dbo.fn_test ('100,105,120')
go
Gruß, Mad Max
Hallo Joni,
Du hattest den Eindruck erweckt, daß Du die Nummern innerhalb einer Funktion benötigst, das Problem löst Du mit obigem Skript. Der return-Befehl von Dir funktioniert aber natürlich nicht. Wenn es doch nicht in einer Funktion benötigt wird, sondern in mehreren selects, dann funktioniert der richtige Weg bei Dir doch schon (Variante 1 von oben).
Gruß, Mad Max
Du hattest den Eindruck erweckt, daß Du die Nummern innerhalb einer Funktion benötigst, das Problem löst Du mit obigem Skript. Der return-Befehl von Dir funktioniert aber natürlich nicht. Wenn es doch nicht in einer Funktion benötigt wird, sondern in mehreren selects, dann funktioniert der richtige Weg bei Dir doch schon (Variante 1 von oben).
Gruß, Mad Max