2017-10-04 10 views
0

私はこの問題に関してあなたの助けを求めたいと思います。どのようにOUTPUTパラメータを使用してストアドプロシージャの結果を取得する

私のテーブルの1つの列を更新する変数が必要です。

私が遭遇した最初の問題は、これらの列が数値かどうかをチェックして、一連の列からデータを取得する必要があることです。

これを解決するために、私はTSQLを使いました。今ここで私は窮地に瀕しているようです。この手順の結果を取得する必要があります。私はそれを関数に変換しようとしましたが、多くの試行(およびいくつかのGoogle検索)によるとTSQLは関数hereのように使用できないようですので、ストアドプロシージャに固執しますが、結果をどのように取得しますか?私は、出力パラメータを使用しようとしましたが、私はこのエラーで打撃を受ける

The formal parameter "@R" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output. 

私は、出力パラメータとしてRを宣言したにもかかわらず、私はまた私のsp_executesqlトランザクションで結果を出力する@Rを宣言したが、私はまだエラーが出ます何が間違っているのか尋ねてもいいですか?

ストアドプロシージャは正常に動作しています。出力が必要です。ありがとうございました。 docs 1として

ALTER procedure [dbo].[SaveRinHead] 


@SumNo as nvarchar(15) 
,@R as decimal(18,3) output 

as 

declare @cursor CURSOR 
declare @colname as integer 
declare @top as integer 
declare @query as nvarchar(MAX) 
declare @TSQL as nvarchar(MAX) 
declare @topass as nvarchar(MAX) = '' 
declare @DimItem as nvarchar(10) 

set @DimItem = (select distinct dimitem from SumNo) 

SET @cursor = CURSOR FOR 
(select cast([Name] as decimal(18,0)) from sys.columns where object_id in (select object_id from sys.tables where [name] = 'ADetails')and [Name] in ('1','2','3','4','5','6','7','8','9','10'))order by [Name] asc 


OPEN @cursor 

FETCH NEXT 

FROM @cursor INTO @colname 
WHILE @@FETCH_STATUS = 0 
BEGIN 



    set @top = (select CASE WHEN Isnumeric(@colname) = 1 
    THEN CONVERT(int,@colname) 
    ELSE 0 END AS COLUMNA) 

    if @top <= '5' 
    BEGIN 
    set @query = '(['+cast(@top as nvarchar(10)) + ']) ,' 
    set @topass = rtrim(ltrim(@topass)) +' '+rtrim(ltrim(@query)) 

    END 

FETCH NEXT 

FROM @cursor INTO @colName 
END 

CLOSE @cursor 
DEALLOCATE @cursor 


set @topass = (SELECT SUBSTRING(@topass,1, len(@topass)-1)) 

begin 


set @TSQL = ' 
SELECT @R = (MAX(MaxValue) - MIN(MinValue)) FROM ADetails 
CROSS APPLY (SELECT MIN(d) MinValue FROM (VALUES '[email protected]+') AS a(d)) X 
CROSS APPLY (SELECT MAX(d) MaxValue FROM (VALUES '[email protected]+') AS a(d)) Y 
where SumNo= @SumNo' 

exec sp_executesql @TSQL, N'@DimItem nvarchar(10), @R decimal(18,3), @SumNo nvarchar(15)', @DimItem, @R output, @SumNo 

update ADetails set R = @R where SumNo= @SumNo 


end 

答えて

2

、あなたはsp_executesqlを呼び出すときの両方パラメータ宣言とパラメータリストをoutputキーワードを指定する必要があります。

exec sp_executesql @TSQL, N'@DimItem nvarchar(10), @R decimal(18,3) output, @SumNo nvarchar(15)', 
    @DimItem, @R output, @SumNo; 
+0

Oは、ありがとうございました!私はまだ答えを探しています、ありがとう! –

関連する問題