none
SELECT IN () - Statement funktioniert nicht bei PArameterübergabe RRS feed

  • Frage

  • Ich habe eine Frage zu einem "select in ()" statement

    Möchte gerne eine varchar(100) Spalte über den "in ()" Tag filtern!

    Der T-SQL-Befehl funktioniert einwandfrei:

    SELECT
    COUNT(T.[GUID])
    FROM VIEW T WHERE T.SPALTE IN ('Wert1','Wert2')
    Nun möchte ich den IN-Wert aber variabel in eine Prozedur integrieren!
    Das funktioniert dann aber leider nicht mehr?! Kann mir einer sagen wieso und warum?
    BEGIN
    DECLARE @IN_STRING AS VARCHAR(500)
    SELECT @IN_STRING = MEINE_SPALTE FROM MEINE TABELLE where GUID = 4711
    SELECT
    COUNT(T.[GUID])
    FROM VIEW T WHERE T.SPALTE IN (@IN_STRING)
    END
    
    Ich erhalte zwar ein Recordset aber nur leer. D.h der IN-STRING wird nicht gefunden, obwohl Werte vorhanden sind!
    Kann mir jemand einen Tipp geben?
    Donnerstag, 28. Mai 2009 07:06

Antworten

  • Das kann auch nicht funktionieren, da der String ('Finance, Geschäftsführung') für Dich zwar mehr als einen Wert enthält, für SQL Server aber nur eine einzige Zeichenfolge ist. Und da es wahrscheinlich keine solche Abteilung gibt, kommt halt kein Ergebnis zurück.

    Was anderes wäre es, wenn Du diesen Befehl dynamisch ausführen würdest. Lies Dir mal dies durch: http://www.sommarskog.se/arrays-in-sql.html


    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Donnerstag, 28. Mai 2009 12:03
  • Hallo,
    das Problem in diesem Fall ist die Notation denn die Variable wird nicht richtig abgefüllt.

    der Inhalt der Variable müsste folgendermassen aussehen: 'Wert1', 'Wert2', 'Wert3'...

    nur dann wird der Inhalt als mehrere unterschiedliche Strings erkannt. Die Variable dann aber so abzufüllen, wäre äusserst umständlich.

    um das zu umgehen müsstest Du wie folgt vorgehen:

    Lösungsvorschlag 1:


    BEGIN
    SELECT guid,COUNT(T.[GUID])
    FROM #meine_Tabelle T WHERE T.Meine_Spalte IN (SELECT MEINE_SPALTE FROM #MEINE_TABELLE where GUID = 4711)
    group by GUID
    END

    In diesem Fall könntest Du die GUID als variable an die SP übergeben. Oder du arbeitest mit einer TABLE Variable, dass würde dann wie folgt aussehen:


    Lösungsvorschlag 2:

    BEGIN
        DECLARE @IN_STRING AS TABLE (MEINE_SPALTE VARCHAR(500))
        INSERT INTO @IN_STRING SELECT MEINE_SPALTE FROM MEINE TABELLE where GUID = 4711
        SELECT
        COUNT(T.[GUID])
        FROM VIEW T WHERE T.SPALTE IN (SELECT MEINE_SPALTE FROM @IN_STRING)
    END

    Sollte beides funktionieren.

    Grüsse

    Pichel

    Freitag, 29. Mai 2009 08:26

Alle Antworten

  • Ich vermute, Du hast das SET NOCOUNT ON vergessen.
    Versuch mal mein Beispiel:
    Set Nocount on
    create table #meine_Tabelle (GUID integer, Meine_Spalte varchar(10));

    insert into #meine_Tabelle(GUID, Meine_Spalte) values(1, '2');
    insert into #meine_Tabelle(GUID, Meine_Spalte) values(4711, '100');
    go

    BEGIN
    DECLARE @IN_STRING AS VARCHAR(500)
    SELECT @IN_STRING = MEINE_SPALTE FROM #MEINE_TABELLE where GUID = 4711
    print @in_String
    SELECT guid,COUNT(T.[GUID])
    FROM #meine_Tabelle T WHERE T.Meine_Spalte IN (@IN_STRING)
    group by GUID
    END

    go
    drop table #meine_Tabelle


    Einen schönen Tag noch, Christoph Muthmann Microsoft SQL Server MVP, http://www.insidesql.org
    Donnerstag, 28. Mai 2009 08:00
  • Ich habe eine Frage zu einem "select in ()" statement

    Möchte gerne eine varchar(100) Spalte über den "in ()" Tag filtern!

    Der T-SQL-Befehl funktioniert einwandfrei:

    SELECT
    
    COUNT(T.[GUID])
    
    FROM VIEW T WHERE T.SPALTE IN ('Wert1','Wert2')
    Nun möchte ich den IN-Wert aber variabel in eine Prozedur integrieren!
    Das funktioniert dann aber leider nicht mehr?! Kann mir einer sagen wieso und warum?
    BEGIN
    
    DECLARE @IN_STRING AS VARCHAR(500)
    
    SELECT @IN_STRING = MEINE_SPALTE FROM MEINE TABELLE where GUID = 4711
    
    SELECT
    
    COUNT(T.[GUID])
    
    FROM VIEW T WHERE T.SPALTE IN (@IN_STRING)
    
    END
    
    
    Ich erhalte zwar ein Recordset aber nur leer. D.h der IN-STRING wird nicht gefunden, obwohl Werte vorhanden sind!
    Kann mir jemand einen Tipp geben?

    Ich bin mir nicht ganz sicher, ob ich dich richtig verstehe. Kannst du mal am einem Beispiel mit Daten verdeutlichen, was du versuchst und was als Ergebnis zurückgegeben werden soll?

    Kannst es übrigens sein, dass NULL Marker in T.SPALTE vorhanden sind?
    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Donnerstag, 28. Mai 2009 09:38
  • Hallo Christoh, hallo Frank
    ich habe jetzt Christoph's Methode angewandt und siehe da mit 1 Wert geht es mit zweien allerdings nicht mehr!
    NULL-Werte existieren nicht, da ich DEfault-Werte setze!
    Zur Funktionsweise nochmal:
    Ich habe eine Konfigurationstabelle für einen User mittels Befehl:
    Set Nocount on
    create table TBKONFIG (GUID integer, IN_STRING varchar(500));
    angelegt. Hintergrund: der User wählt aus Oberfläche Abteilungen, die er sehen möchte!
    Mittels Insert Into inserte ich die Werte. Bspws wenn der User 2 Abteilungen auswählt:
    insert into TBKONFIG (GUID, IN_STRING) values(1, 'Finance, Geschäftsführung');
    Jetzt sollen aus einem View nur noch die Zeilen angezeigt werden, die in der Spalte ABTEILUNG entweder Finance oder Geschäftsführung aufweisen. Also
    selektiere ich mit folgendem Statement:
     
    BEGIN
    DECLARE @IN_STRING AS VARCHAR(500)
    SELECT @IN_STRING = IN_STRING FROM TBKONFIG where GUID = 1
    print @in_String
    SELECT COUNT(T.GERAET_ID) AS ANZAHL
    FROM MEIN_VIEW T WHERE T.ABTEILUNG IN (@IN_STRING)
    END
    Wie gesagt: Wenn nur 1 Abteilung ausgewählt wird und somit nur 1 Wert im @inString steht funktionierts bei n-Werten geteilt durch ", " aber nicht mehr!!
    Habe dasselbe auf der - dem View zugrundeliegenden Tabelle - ebenfalls probiert!
    Bin im Moment ratlos!
    Donnerstag, 28. Mai 2009 11:52
  • Das kann auch nicht funktionieren, da der String ('Finance, Geschäftsführung') für Dich zwar mehr als einen Wert enthält, für SQL Server aber nur eine einzige Zeichenfolge ist. Und da es wahrscheinlich keine solche Abteilung gibt, kommt halt kein Ergebnis zurück.

    Was anderes wäre es, wenn Du diesen Befehl dynamisch ausführen würdest. Lies Dir mal dies durch: http://www.sommarskog.se/arrays-in-sql.html


    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Donnerstag, 28. Mai 2009 12:03
  • Hallo,
    das Problem in diesem Fall ist die Notation denn die Variable wird nicht richtig abgefüllt.

    der Inhalt der Variable müsste folgendermassen aussehen: 'Wert1', 'Wert2', 'Wert3'...

    nur dann wird der Inhalt als mehrere unterschiedliche Strings erkannt. Die Variable dann aber so abzufüllen, wäre äusserst umständlich.

    um das zu umgehen müsstest Du wie folgt vorgehen:

    Lösungsvorschlag 1:


    BEGIN
    SELECT guid,COUNT(T.[GUID])
    FROM #meine_Tabelle T WHERE T.Meine_Spalte IN (SELECT MEINE_SPALTE FROM #MEINE_TABELLE where GUID = 4711)
    group by GUID
    END

    In diesem Fall könntest Du die GUID als variable an die SP übergeben. Oder du arbeitest mit einer TABLE Variable, dass würde dann wie folgt aussehen:


    Lösungsvorschlag 2:

    BEGIN
        DECLARE @IN_STRING AS TABLE (MEINE_SPALTE VARCHAR(500))
        INSERT INTO @IN_STRING SELECT MEINE_SPALTE FROM MEINE TABELLE where GUID = 4711
        SELECT
        COUNT(T.[GUID])
        FROM VIEW T WHERE T.SPALTE IN (SELECT MEINE_SPALTE FROM @IN_STRING)
    END

    Sollte beides funktionieren.

    Grüsse

    Pichel

    Freitag, 29. Mai 2009 08:26
  • Hallo zusammen,
    ich danke für Eure Antworten.
    @Frank: bei Deiner Antwort hat es geklingelt!
    @Pichel: auch Dir danke, hast das nochmal schön aufgeschlüsselt!
    Ich habe es nun mit folgendem select gelöst:
    SELECT COUNT(T.GERAET_ID) AS ANZAHL
    FROM MEIN_VIEW T WHERE T.ABTEILUNG IN (SELECT IN_STRING FROM TBKONFIG where GUID = 1)
    Danke Euch vielmals!
    Freitag, 29. Mai 2009 13:29