2

これを実装する方法はわかりませんが、ストアド プロシージャのパラメータの現在のリストと渡された値を取得する方法が必要です (このコードはストアド プロシージャ自体で実行されます)。

パラメータ名を取得するために使用できることはわかってsys.parametersいますが、実際の値を取得するにはどうすればよいですか?

これで行う必要があるのは、次の形式の文字列を作成することです

@param_name1=@value1,@param_name2=@value2,...,@param_namen=@valuen

私は動的SQLを使用しようとしましたが、それにはあまり喜びがありません。

何か案は??

編集:

現在、すべてのパラメーターを 1 つずつ調べて、文字列を作成しています。ただし、かなりの数のパラメーターがあるため、「より良い」方法が必要です。また、後でパラメーターが追加された場合に備えて (ただし、文字列を生成するコードは更新されません)。

sp_executesql動的SQLを使用しようとしましたが、 spにはパラメーターを渡す必要があるため、あきらめました...

4

2 に答える 2

3

「(このコードはストアド プロシージャ自体で実行されます)」と述べています。したがって、プロシージャを作成するときにパラメータを宣言する必要があるため、プロシージャにいると仮定すると、パラメータ名はすでにわかっています。選択して名前をテキストフィールドに入れるだけです

ALTER PROCEDURE procname
(
     @param1 NVARCHAR(255)
    ,@param2 INT
    ...
)

SELECT [Parameters] = '@param1=' + @param1 
                    + ',@param2=' + CONVERT(NVARCHAR(MAX),@param2)...

これCONVERTは、char 以外のデータ型の例です。


アップデート

この関数を使用するには、それ自体を指すリンク サーバーを作成する必要がありますOPENQUERY

USE [master]
GO

/****** Object:  LinkedServer [.]    Script Date: 04/03/2013 16:22:13 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'.', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'.', @provstr=N'Integrated Security=SSPI'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'.',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

GO

これで、次のカーソルのような操作を実行して各パラメーター名を取得し、動的 ​​SQL を使用しOPENQUERYて値を取得できます。

DECLARE curParms CURSOR FOR
SELECT
    name
FROM sys.parameters
WHERE OBJECT_ID = OBJECT_ID('schema.procedurename')
ORDER BY parameter_id
OPEN curParms
FETCH curParms INTO @parmName
WHILE @@FETCH_STATUS <> -1
BEGIN
    SELECT @parmName + '=' + (SELECT * FROM OPENQUERY('linkedservername','SELECT ' + @parmName))
    FETCH curParms INTO @parmName
END
CLOSE curParms
DEALLOCATE curParms
于 2013-03-04T13:02:02.170 に答える