2016-09-12 9 views
1

SQL Server 2014s TSQLのPostgreSQLストアドプロシージャ/関数を書き直そうとしています。複数の行のデータを返すTSQLプロシージャ

私はこのストアドプロシージャから私の値を返すのには苦労していますが、これは単なるテストですが、私は2つの変数si_codeとco_descに対してこの場合複数の行のデータを返そうとしています。

(テストとして)次のように私は私の手順を持っている

if (object_id('p_get_serial')) is not null 
    drop procedure p_get_serial 
go 

create procedure p_get_serial(@par01 char(20), @par02 integer) 
as 

    declare 
     @co_num integer, 
     @co_desc char(20), 
     @si_code char(20), 
     @log char(40) 

    declare mycur cursor for 
     select co_num, co_desc 
     from colours 
     where co_num <= @par02 

    open mycur 
    fetch next from mycur into @co_num, 
           @co_desc 

    while @@FETCH_STATUS = 0 
    begin 

     set @si_code = '' 

    select @si_code = si_code 
     from sitems 
     where si_co_num = @co_num 

     set @log = @co_desc + ' ' + @si_code 
     raiserror(@log,0,1) with nowait 

     fetch next from mycur into @co_num, @co_desc 

    end 
    close mycur deallocate mycur 

go 

exec p_get_serial @par01 = 'paramater01', @par02 = 10 

いくつかの行があることを知って、私の結果を返すための最良の方法は何ですか?

+0

入力テーブルと出力を表示する必要があります。彼らは最後の手段である)。無条件ライザーの意図は何ですか? –

+0

この例では私はカーソルを必要としません。これは単なるテストであり、実際のプロシージャはカーソルなしでは複雑すぎます。 – Trent

+0

テーブルを出力するファンクションも考えられます。しかし、SPが唯一の方法であれば、テーブル変数を作成/定義し、spの終わりにそれを出力します。また、一般的に、カーソルはSQL Serverでは「不良」(全体的なパフォーマンスが悪い)です。あなたがカーソルを避ける方法を見つけることができれば、より良いパフォーマンスが得られます。 – ripvlan

答えて

1

T-SQLでは、カーソルを宣言する必要はありません。ちょうどselectあなたが必要とし、それはクライアントアプリケーションで利用できるようになります。

カーソルはOracle/DB2/PostgreSQLなどのデータを返す方法です。 SQL Serverはそれを必要としません。

create procedure p 
as 
    select 1 as a 

は、1つの列で1つのレコードを含むレコードセットを返します。

create procedure p 
as 
    select 1 as a, 'a' as b 
    union select 2, 'b' 

は、それぞれ2つの列を持つ2つの行を返します。結果セットを返す前に、より複雑な処理の

例:

create procedure p 
as 
begin 
    declare @a int, @b varchar(10) 

    select @a = 1 
    select @b = convert(varchar(10), @a) 

    select @a = @a + 1 

    select @a as a, @b as b -- this will be the resultset returned to the client 
end 
+0

私は1つの選択で必要な結果を達成することができません。再作成しようとしている手順は、もっと複雑です。 – Trent

+0

複雑な手順を設計することはできますが、 MS SQLの下で使用する必要があります:最終的な 'select'は結果セットをクライアントに返します。そのデータセットを構築する処理はすべてあなた次第です。しかし、結果セットが必要ない場合は、https://technet.microsoft.com/en-us/library/ms187004%28v=sql.105%29.aspx – ajeh

+0

も可能であることに留意してください。私は束を感謝する必要があります – Trent

0

あなたは、単に一時テーブルまたはテーブル変数に各行のデータを保存し、ちょうどSELECTステートメントを記述するだけですストアドプロシージャの最後に。 あなたの質問は正確に必要なものが明確ではなく、カーソルとwhileループを持っていると冗長であるように見えます

関連する問題