2016-10-23 7 views
-1

私はSQL Server 2012を使用しています。ストアドプロシージャを起動しようとするとエラーが発生するのはなぜですか?

Visual Studioからストアドプロシージャに整数の配列を渡す必要があります。私はwhere節に渡された配列を使用する必要があります。この目的のために

私はtable valued parameterを作成しました:

CREATE TYPE IdArray AS TABLE 
(
    Id int 
); 

そして、ここに私のストアドプロシージャ:

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 
    @List dbo.IdArray READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM Clients 
    WHERE Clients.Id IN ('@List') 
END 

しかし、私は、ストアドプロシージャを発射しようと実行手順ウィンドウ内の値(いくつかの整数)を通過このエラーが表示されます。

Must pass parameter number 2 and subsequent parameters as '@name = value'. After the form '@name = value' has been used, all subsequent parameters must be passed in the form '@name = value'.

UPDATE:私はこのエラーを取得する理由

DECLARE @return_value int 

EXEC @return_value = [dbo].[SP_TEST_TLP] 
     @List = 1,6 

SELECT 'Return Value' = @return_value 

任意のアイデア:ここで私は、ストアドプロシージャを呼び出す方法

?私は間違って何をしていますか?

+1

あなたが間違っていることを指摘したい場合は、procを実行するために使用しているコードを投稿してください。また、ストアド・プロシージャ名の接頭辞として 'sp_'を使用しないでください。これは、SQL Serverシステムストアドプロシージャを示します。 TVPを囲んではいけません。その代わりに、 'SELECT id FROM @ List'のようなサブクエリーを指定してください。 –

+0

'ここで、Clients.Id IN( '@List')'はあなたが望むことをしません。あなたはすでに正しい構文が与えられていますhttp://stackoverflow.com/questions/40206849/why-i-get-error-when-i-try-to-create-stored-procedure –

+0

プロシージャを実行するコードを入手できますかウィンドウが生成されますか?プロシージャウィンドウの実行には、@name = value構文を使用してSPを呼び出します。カンマ区切り(1,2,3)で数字を書いているのであれば、おそらく '@List = 1,2,3 'と解釈され、それはあなたが望むものではありません。 – infiniteRefactor

答えて

2

テーブル値型とTSQLのパラメータは、あなたが想像したものとは少し異なります。

テーブル値のパラメータは基本的にテーブルであり、配列やリストではありません。カンマ区切り構文を使用して複数の値を指定することはできません。

あなたは私はあなたがストアドプロシージャインタフェースを実行しでこれを行うことができないと思います

DECLARE @return_value int 
DECLARE @MyList AS dbo.IdArray 

INSERT INTO @MyList (Id) 
VALUES (1),(6) 

EXEC @return_value = [dbo].[SP_TEST_TLP] @List = @MyList 

SELECT 'Return Value' = @return_value 

のようにそれを行う必要があります。

ストアドプロシージャ本体では、テーブル名を使用するように@Listを使用する必要があります。 ... IN ('$List')...構成は機能しません。結合またはサブクエリを使用する必要があります。覚えておいてください、@Listはテーブルです。

+0

ありがとうございました。私はどのようにビジュアルスタジオからint値の配列を渡すことができますテーブルの値を設定するには、任意の考えを持っていますか? – Michael

+0

@Michael、System.Data.SqlDbType.Structured型のパラメーターを渡します。値は 'DataTable'、' DataRow [] '、' IEnumerable 'です。おそらく、整数リストを含むDataTableが最も簡単です。 –

関連する問題