2017-03-05 7 views
0

私は単純なSQLクエリを持っていますが、入力パラメータは複数の値の文字列です。私はこれが動作するようにしようとしていますが、多分私の構文がオフまたはこれのようなことはできません? @Cat = '13+14+15'CatIDSQLで選択して変換することはできますか?

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

TINYINTです。私も運が無ければCONVERT(TINYINT,*)を使ってみました。 以前は次のコードを使用していましたが、他の複雑な問題のために切り替えようとしていました。

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

これを行う別の方法がある場合は、私は提案に公開しています。多分整数に直接分割するのでしょうか?ありがとう!

+0

どのようなエラーが表示されますか? –

+0

私はお詫びします。コードは期待どおりに動作しています。 – MuffinMan

答えて

1

あなたはFROM句で別名を使用してstring_split()の引数を呼び出すために何を指定することができれば、それはいいだろう:

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

しかし、文法はそれを許可していないようです。あなたのサブクエリソリューションは、よりよい解決策のように思えますが、私はCTEでそれをラップします。あなたは再帰CTEを使用して、整数に直接分割することができ

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); 

まあ、私は、これは「直接」であるかどうかわからないんだけど、それはUDFを必要としません。

+0

私はss(val)を使用しようとしていますが、それは私にエラーを与えています。 ''STRING_SPLIT'は認識された関数名ではありません。 ' – MuffinMan

+0

@MuffinMan。 。 。私はあなたの質問から構文を使用しています。文字列分割関数を簡単にダウンロードすることができます(google "sql server string split")。関数を呼び出すときは、スキーマ名を含める必要があります。 –

+0

'STRING_SPLIT'は2016年に組み込まれた関数です。 –

関連する問題