2016-09-06 5 views
1

Ich bin völlig neu in SQL. Während des Studiums hatte ich das unten gezeigte Problem gefunden.In() Operator funktioniert nicht

Wenn ich Abfrage ausführen bekomme ich als 125,130,131 ausgegeben. Ich speichere diese Ausgabe in @issueid Variable.

declare @issueid varchar(100) 

set @issueid = (
    SELECT STUFF(
      (
       SELECT ','+convert(varchar,ism_id) 
       FROM table where ism_group_name='TEST_COPY' 
       FOR XML PATH('') 
      ) ,1,1,'')) 

Aber wenn ich @issueid Variable in folgenden Abfrage bekomme ich seltsame Verhalten:

  • Wenn ich @issueid='125' passiere ich die Ergebnisse erhalten
  • Wenn ich @issueid='125,130,131' geben es keine Ausgabe zeigt.

Meine Frage:

SELECT * 
FROM 
    ISSUE_MASTER (NOLOCK), 
    ORDER_ENTRY_PPDI (NOLOCK) 
WHERE ISM_ID= OE_ISSUE_ID 
    and ism_id=oe_issue_id 
    and convert(varchar,oe_issue_id) in (@issueid) 
    AND ISM_STATUS = 0 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

Bitte um Hilfe! Was mache ich falsch?

+2

Warum Concat Integer-Werte als String, wenn Sie es schließlich für Integer-Datentyp verwenden möchten? Verwenden Sie stattdessen die Tabellenvariable, um die Problem-ID zu erfassen, und verwenden Sie sie dann in Ihrer zweiten Abfrage. –

+1

Wird Ihre Variable '@ issueid' an einer anderen Stelle als der von Ihnen angegebenen verwendet? Wenn nicht, würde ich die Werte überhaupt nicht in einer Variablen speichern, sondern mich direkt mit Ihrer Tabelle "Tabelle" verbinden. – Aquillo

Antwort

1

Sie können dynamisches SQL für dieses spezielle Problem verwenden, aber wie @Aquillo kommentierte, ist es kein guter Weg. Es ist besser, die erste Tabelle mit Tabellen verknüpfen Sie benötigen, ohne Komma getrennt Parameter zu machen:

SELECT im.*, 
     oe.* 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID 
INNER JOIN [table] t 
    ON oe.oe_issue_id = t.ism_id 
WHERE ISM_STATUS = 0 
    AND ism_group_name='TEST_COPY' 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

Eine andere Lösung ist @issueid Tabelle mit Hilfe von XML zu übersetzen und schließlich beitreten:

DECLARE @x xml 

SELECT @x = CAST('<v>'+REPLACE(@issueid,',','</v><v>')+'</v>' as xml) 

SELECT im.*, 
     oe.* 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID 
INNER JOIN (
     SELECT t.v.value('.','int') as ism_id 
     FROM @x.nodes('/v') as t(v) 
    ) t 
    ON oe.oe_issue_id = t.ism_id 
WHERE ISM_STATUS = 0 
    AND ism_group_name='TEST_COPY' 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID 

Dynamisches SQL:

DECLARE @sql nvarchar(max) 

@sql = N' 
SELECT * 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ONim.ISM_ID= oe.OE_ISSUE_ID 
WHERE convert(varchar,oe_issue_id) in ('[email protected]+') 
    AND ISM_STATUS = 0 
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID' 

EXEC sp_executesql @sql 

Hinweis: Verwendung Aliase, neue Art verbinden verwenden.

+0

Obwohl dies funktionieren würde, ist der Ansatz bei weitem nicht der beste Weg, mit dem gegebenen Problem umzugehen. Ich würde OP nicht empfehlen, mehrere Werte zu implodieren, nur um nach einem einzelnen Wert in der resultierenden Zeichenkette zu suchen. – Aquillo

+0

@Aquillo Es ist besser, die erste Tabelle mit der Zieltabelle zu verbinden, ohne kommagetrennte Parameter zu verwenden. Oder OP kann '@ issueid' mit Hilfe von XML in Tabelle umwandeln und beitreten. – gofr1

+0

Genau, das meine ich. Obwohl Sie auf die Frage von OP eine Antwort gegeben haben, gibt es das Problem des "falschen" (bei weitem nicht die beste) Ansatzes, den das OP gewählt hat und der in Ihrer Antwort nicht behandelt wird. – Aquillo