2009-04-12 10 views
0

成功または失敗に基づいて2つの結果セットを返すストアドプロシージャがあります。成功または失敗に基づいて結果セットが返される

SP成功の結果セット:名前、ID、エラー、DESC
SPの失敗の結果SRET:エラー、DESC

私は、ストアドプロシージャの結果を取得するには、次のクエリを使用しています。成功の場合は0、失敗の場合は-1を返します。

declare @ret int 

DECLARE @tmp TABLE (
    name char(70), 
    id int, 
    error char(2), 
    desc varchar(30) 
) 

insert into @tmp 
EXEC @ret = sptest '100','King' 

select @ret 

select * from @tmp 

SPが成功すると、列が一致するので、4つのフィールドが一時テーブルに挿入されます。 しかし、エラーが発生した場合、sp結果セットにはtempテーブルの列が一致しないエラーとdescのみがあります。 。私はSpを変更できませんので、何かする必要があります)を使用して失敗と成功の両方を処理します。

答えて

0

私の障害! 回答が早すぎました。 戻り値だけをrelvする必要があるので、それに対してロジックを構築するほうがはるかに優れています。

まだtempテーブルを使用したい場合は、sptestを2回呼び出すことで対処することができます(ただし最適ではありません)。戻り値を取得してそれに基づいて2つの異なる一時テーブルがありますあなたはいっぱいです(1つは4つのフィールドで、もう1つは2つのフィールドのみである)。

declare @ret int 

DECLARE @tmp TABLE (name CHAR(70), id INT, error char(2), desc varchar(30)) 
DECLARE @tmperror TABLE (error char(2), desc varchar(30)) 


EXEC @ret = sptest '100','King' 

IF @ret != 0 
BEGIN 
    INSERT INTO @tmperror 
    EXEC sptest '100','King'; 
    SELECT * FROM @tmperror; 
END 
ELSE 
BEGIN 
    INSERT INTO @tmp 
    EXEC sptest '100','King'; 
    SELECT * FROM @tmp; 
END 

この解決策は最適ではありません。

0

2つの異なるレコードセットを返し、同じ一時テーブルをロードすることはできません。 どちらのテーブルも2つの異なるテーブルを試してみることはできません。

2つのオプションがあります。

  1. 第一ペア(名前、ID)の列

  2. すべての4列がすべての条件で返され、あなたのストアドプロシージャ

    • を変更し、エラー
    • 第二ペア(エラー、DESC)にNULLです成功した場合はNULLです。
  3. SQL Server 2005を使用している場合は、TRY/CATCHを使用して成功を分離します。障害コードパス。以下のコードは、新しいエラー処理を使用して例外/ RAISERRORを介してエラー結果セットを返すことに依存しています。

例:

CREATE PROC sptest 
AS 
DECLARE @errmsg varchar(2000) 

BEGIN TRY 
    do stuff 
    SELECT col1, col2, col3, col4 FROM table etc 
    --do more stuff 
END TRY 
BEGIN CATCH 
    SELECT @errmsg = ERROR_MESSAGE() 
    RAISERROR ('Oops! %s', 16, 1, @errmsg) 
END CATCH 
GO 

DECLARE @tmp TABLE (name CHAR(70), id INT, error char(2), desc varchar(30) 

BEGIN TRY 
    insert into @tmp 
    EXEC sptest '100','King' 
    select * from @tmp 
END TRY 
BEGIN CATCH 
    PRINT ERROR_MESSAGE() 
END CATCH 
0

試しがあなたのテーブル定義を変更するので、最初の2つの列がNULL可能であること:このことができます

DECLARE @tmp TABLE (
name char(70) null, 
id int null, 
error char(2), 
desc varchar(30) 

希望、

ビル

0

これは、1回の呼び出しでは実行できません。戻りステータスを取得し、ステータスに応じて分岐するINSERT..EXECコマンドを1回呼び出す必要があります。このコマンドは、返される列の数に対して機能します。TRYを使用して成功したと仮定して呼び出します。 .CATCH、そしてCatchでそれが失敗したと再び仮定します(これはCATCHへの到達方法です)。

一貫性のある列セットを返すようにストアドプロシージャを書き直すか、独自のストアドプロシージャ、テーブル値の関数またはクエリを書き込むために、このストアドプロシージャからコードを抽出し、それはあなたの使用に。これはSQLでの適切な答えです。

関連する問題