次のパラメーターを持つ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)
私はこのようなことを試みましたが、うまくいきません。
例で作成したSELECTクエリは、おそらく複数の行を返します(SELECTにはWHERE句またはTOP(n)はありません)。 SQL Server 2008から、プロシージャに「表」のパラメーターセットを使用させることを目的とする場合は、テーブル値パラメーターを使用できます。
これには、ユーザー定義のテーブルtableの作成が含まれ、ほぼ間違いなく、ストアドプロシージャ内のロジックの調整を意味します。
お役に立てれば :)
詳細については、 http://msdn.Microsoft.com/en-us/library/bb510489(SQL.100).aspx を参照してください。
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