3 Stimmen

Variable "IN" Ausdruck in SQL

Mögliche Duplikate:
SQL Multiple Parameter Values
SQL Server (2008) Pass ArrayList or String to SP for IN()

Ich möchte einige Zeilen aus einer Tabelle auswählen, die bestimmte Werte haben, die zum Zeitpunkt des Schreibens einer gespeicherten Prozedur nicht bekannt sind. Zum Beispiel die Suche nach Büchern eines bestimmten Typs oder Typs in einer Bibliotheksdatenbank:

SELECT * FROM Bücher WHERE Typ IN (_expr_);

Wo ich _expr_ auf ('Humor', 'Thriller') bei einem Lauf haben möchte, und vielleicht ('Bildung') bei einem anderen, je nach den Entscheidungen des Benutzers. Wie kann ich den Ausdruck zur Laufzeit variieren lassen?

Leider habe ich noch viel über SQL im Allgemeinen zu lernen und bin mir nicht sicher, ob ich überhaupt eine sinnvolle Frage stelle. Ich würde mich über jede Hilfe freuen!

4voto

Martin Smith Punkte 417623

Dies ist in SQL Server 2005 kniffliger als man denkt (2008 bietet tabellenwertige Parameter, die es einfacher machen)

Siehe http://www.sommarskog.se/arrays-in-sql-2005.html für eine Übersicht über die Methoden.

2voto

ScottE Punkte 21245

Ich habe das Gefühl, dass ich diese Frage schon einmal beantwortet habe...

Auf jeden Fall habe ich lange Zeit die folgende benutzerdefinierte Split-Funktion verwendet:

Verwendung: dbo.Split("@ParamName", ",") wobei der 2. Parameter der Trennzeichen ist.

Sie können dies dann mit einer Tabelle verbinden, da es eine Tabellenwertfunktion mit der ElementID und dem Element zurückgibt.

CREATE FUNCTION [dbo].[Split]
(
@vcDelimitedString varchar(max),
@vcDelimiter varchar(100)
)
RETURNS @tblArray TABLE
   (
    ElementID smallint  IDENTITY(1,1), --Array-Index
    Element varchar(1000) --Array-Element-Inhalte
   )
AS
BEGIN
    DECLARE @siIndex smallint, @siStart smallint, @siDelSize smallint
    SET @siDelSize  = LEN(@vcDelimiter)
    --Schleife durch die Quellzeichenkette und fügen Sie Elemente der Zieltabellenarray hinzu
    WHILE LEN(@vcDelimitedString) > 0
    BEGIN
        SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
        IF @siIndex = 0
        BEGIN
            INSERT INTO @tblArray VALUES(@vcDelimitedString)
            BREAK
        END
        ELSE
        BEGIN
            INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
            SET @siStart = @siIndex + @siDelSize
            SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , LEN(@vcDelimitedString) - @siStart + 1)
        END
    END
    RETURN
END

1voto

Joel Coehoorn Punkte 377088

Was Sie hier für den SQL Server 2005 und frühere Versionen tun, ist, die Benutzerparameter in einer Tabelle zu speichern und dann aus der Tabelle auszuwählen:

select Spalten 
from Bücher 
where Typ in 
    (
     select Auswahl 
     from BenutzerAuswahl 
     where Sitzungsschlüssel= @sessionkey und Benutzerid= @userid
    )

1voto

Elroy Flynn Punkte 2726

Ein weiterer Ansatz besteht darin, einen SQL-String zu erstellen und ihn mit "execute" auszuführen. Der String ist von der Art "INSERT...SELECT" und fügt die Ergebnisse in eine temporäre Tabelle ein. Anschließend wählen Sie aus der Temp.

declare @sql varchar(1000)
set @sql = 'INSERT INTO sometemptable  SELECT * FROM Books WHERE Type IN ('
set @sql = @sql + {code that builds a syntactically correct list}
set @sql = @sql + ')'
execute @s_sql
select * from sometemptable

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X