4

ユーザーがリストから複数の項目を選択できる CheckBoxList があります。次に、これらの値をストアド プロシージャに渡して、次のような WHERE 条件で使用できるようにする必要があります。

WHERE ID IN (1,2,3)

nvarchar パラメーターになるようにこれを試してみました。文字列1,2,3を次のように渡します。

WHERE ID IN (@IDs)

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

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

どんな助けでも大歓迎です!

4

3 に答える 3

11

やり方はいくつかあります。次の例のように、パラメーターを XML blob として渡すことができます。

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 変数をパラメーターとして渡すことができるテーブル値パラメーターを使用できます。しばらく前に、これら 3 つのアプローチについてブログを書き、パフォーマンスを簡単に比較しました。

于 2011-01-07T10:18:05.803 に答える
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'
于 2011-05-26T12:57:25.080 に答える
-1

同様の問題の解決策を見つけました。これはデータ ドリブン サブスクリプションに使用されますが、パラメーターで使用するように簡単に変更できます。 詳細な説明を含む私のブログ投稿をここで確認してください

ストアド プロシージャ コールへの変換に問題がある場合は、お知らせください。

于 2013-07-17T13:03:25.393 に答える