web-dev-qa-db-ja.com

選択結果をストアドプロシージャのパラメーターとして渡す

次のパラメーターを持つT-SQLストアドプロシージャがあります。

CREATE PROCEDURE [dbo].[SaveData]
-- Add the parameters for the stored procedure here
    @UserID varchar(50),
    @ServiceID varchar(50),
    @param1 varchar(50),
    @param2 varchar(50),
    @endDate datetime
AS BEGIN
    . 
    .
    -- my code --

パラメータとしてselectの結果を渡すことが可能かどうかを知りたい:

    exec SaveDate (SELECT player.UserID,player.ServiceID, 'no','no',GETDATE()
           FROM player)

私はこのようなことを試みましたが、うまくいきません。

20
GVillani82

例で作成したSELECTクエリは、おそらく複数の行を返します(SELECTにはWHERE句またはTOP(n)はありません)。 SQL Server 2008から、プロシージャに「表」のパラメーターセットを使用させることを目的とする場合は、テーブル値パラメーターを使用できます。

これには、ユーザー定義のテーブルtableの作成が含まれ、ほぼ間違いなく、ストアドプロシージャ内のロジックの調整を意味します。

お役に立てれば :)

詳細については、 http://msdn.Microsoft.com/en-us/library/bb510489(SQL.100).aspx を参照してください。

5
MarkD

1. 1つの方法:
a)変数を宣言する
b)単一の選択ステートメントで値を割り当てます
c)ローカル変数を渡すプロシージャを実行します
d)WHILEまたはCURSORを使用してTABLE1のすべての行にこれを適用するために、ループで次を実行します

DECLARE @param1 <DATATYPE>, @param2 <DATATYPE>, ...

SELECT TOP 1 @param1 = col1,    @param2 = col2, ...
FROM TABLE1
WHERE <where_clause>

EXEC SaveDate @param1, @param2, ...

2.他の方法は、独自のテーブルタイプを定義し、それを記入し、プロシージャに渡すことです。ただし、これにはストアドプロシージャを少し変更する必要があります(paramsリストでは、カスタムタイプの後にREADONLYを続ける必要があります)。

CREATE TYPE [dbo].[TYPENAME] AS TABLE(
    [ID] [int] NOT NULL,
    ...
)
GO

DECLARE @myTypeVar TYPENAME;

INSERT @myTypeVar
SELECT col1, col2, ...
FROM TABLE1

EXEC SaveData @myTypeVar
15
Vladislav