2017-03-05 3 views
0

Ich habe eine einfache SQL-Abfrage, aber der Eingabeparameter ist eine Zeichenfolge aus mehreren Werten. Ich versuche, das zum Laufen zu bringen, aber vielleicht ist meine Syntax nicht oder es ist so nicht möglich?Ist es möglich, während der Auswahl in SQL zu konvertieren?

SELECT * 
FROM Table 
WHERE CatID IN 
(SELECT CONVERT(TINYINT,value) FROM STRING_SPLIT(@Cat,'+')) 

wo @Cat = '13+14+15'CatID und ist vom Typ Tinyint. Ich habe auch versucht, CONVERT(TINYINT,*) ohne Glück zu verwenden. Zuvor benutzte ich den folgenden Code, aber ich hoffte, ihn wegen anderer Komplikationen umzuschalten.

Wenn es eine andere Möglichkeit gibt, dies zu tun, bin ich offen für Vorschläge, vielleicht eine Möglichkeit, direkt in ganze Zahlen zu teilen? Vielen Dank!

+0

Welchen Fehler bekommen Sie? –

+0

Ich entschuldige mich, der Fehler war anderswo upstream es stellt sich heraus. Der Code funktioniert wie erwartet. – MuffinMan

Antwort

1

Es wäre schön, wenn Sie angeben können, was das Argument für string_split() nennen eine Alias ​​in der FROM-Klausel:

SELECT t.* 
FROM Table t 
WHERE t.CatID IN (SELECT CONVERT(TINYINT, val) 
        FROM STRING_SPLIT(@Cat, '+') ss(val) 
       ); 

Aber die Grammatik scheint nicht, dass zu ermöglichen. Ihre Unterabfrage-Lösung scheint die bessere Lösung zu sein, obwohl ich das in einem CTE verpacken würde.

Sie können direkt in ganzen Zahlen aufgeteilt, eine rekursive CTE mit:

with cte as (
     select convert(tinyint, left(@cat + '+', charindex('+', @cat) - 1)) as val, 
       substring(@cat, charindex('+', @cat + '+') + 1, len(@cat)) as rest 
     union all 
     select convert(tinyint, left(rest + '+', charindex('+', rest) - 1)), 
       substring(rest, charindex('+', rest + '+') + 1, len(rest)) 
     from cte 
    ) 
select t.* 
from table t 
where t.catid in (select val from cte); 

Nun, ich bin nicht sicher, ob dies „direkt“ ist, aber es erfordert keine UDF.

+0

Ich versuche, die ss (val) zu verwenden, aber es gibt mir einen Fehler dabei. ''STRING_SPLIT' ist kein anerkannter Funktionsname. ' – MuffinMan

+0

@MuffinMan. . . Ich verwende die Syntax aus Ihrer Frage. Sie können eine String-Split-Funktion einfach herunterladen (google "sql server string split"). Wenn Sie eine Funktion aufrufen, müssen Sie den Schemanamen angeben. –

+0

'STRING_SPLIT' ist eine eingebaute Funktion, wenn sie 2016 sind. –

Verwandte Themen