2011-01-07 20 views
3

私は、ユーザがリストから複数の項目を選択できるCheckBoxListを持っています。1つのSQLパラメータに複数の値を渡す

WHERE ID IN (1,2,3) 

私はそのようにそのnvarchar型パラメータこれをやってみましたし、私は、文字列1,2,3を渡します:彼らはのような条件がWHEREで使用することができますので、私はその後、私のストアドプロシージャにこれらの値を渡すことができるようにする必要があります

WHERE ID IN (@IDs) 

しかし、これは次のエラーが返されました:

Conversion failed when converting the nvarchar value '1,2,3' to data type int 

すべてのヘルプははるかに高く評価されるだろう!

+0

http://stackoverflow.com/questions/878833/passing-a-varchar-full-of-comma-delimited-values-to-a-sql-server-in-function(またはビットマスクを使用) –

答えて

11

いくつかの方法があります。 あなたはこの例のようにXMLブロブなどのパラメータに渡すことができます。

CREATE PROCEDURE [dbo].[uspGetCustomersXML] 
    @CustomerIDs XML 
AS 
BEGIN 
SELECT c.ID, c.Name 
FROM [dbo].[Customer] c 
JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int') 
END 
GO 

--Example Use: 
EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>' 

またはCSVなどの値を渡すと、テーブル変数に値を分割し、分割機能を使用する(スプリット機能がたくさんありますそこに、クイック検索は、1つをスローする)。

CREATE PROCEDURE [dbo].[uspGetCustomersCSV] 
    @CustomerIDs VARCHAR(8000) 
AS 
BEGIN 
SELECT c.Id, c.Name 
FROM [dbo].[Customer] c 
JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item 
END 
GO 

--Example Use: 
EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100' 

SQL 2008以降を使用している場合は、テーブル変数を使用して、TABLE変数をパラメータとして渡すことができます。私はbloggedこれらの3つのアプローチについては、戻って、迅速なパフォーマンスの比較で。

+0

ありがとう。結果を得るのにWHERE IN(SELECT [values from XML])句を使用しましたが、以前はこれが可能であることを知らなかったでしょう。乾杯! – Curt

+0

@Curt WHERE IN(SELECT [values from XML])の中の '[[values from XML])'を使う方法を教えてください。手伝って頂けますか?すみません。 – user2705620

1
alter procedure c2 
(@i varchar(5)) 
as 
begin 
    declare @sq nvarchar(4000) 
    set @sq= 'select * from test where id in (<has_i>) ' 
    SET @sq= REPLACE(@sq, '<has_i>', @i) 
    EXECUTE sp_executesql @sq 
end 

exec c2 '1,3' 
-1

私は同様の問題の解決策を見つけました。 これはデータ駆動型サブスクリプションに使用されますが、パラメータで使用するために簡単に変更できます。 check my blog post here with a detailed description

ストアドプロシージャコールに変換できない場合は、私に知らせてください。

+0

少し答えを広げることができますか?近くのリンクのみの回答は、リンクが壊れた場合には役に立ちません。 – orique

関連する問題