2

ストアドプロシージャでは、別のストアドプロシージャの結果のカウントを取得する必要があります。具体的には、結果が返されるのか、空のセットが返されるのかを知る必要があります。

一時テーブル/テーブル変数を作成し、それにストアドプロシージャを実行してから、そのデータに対してselectカウントを実行できます。しかし、私は実際にはデータ自体は気にしません。必要なのはカウント(またはデータの有無)だけです。その情報だけを取得するより効率的な方法があるかどうか疑問に思いました。

他のストアドプロシージャの内容をコピーして、選択カウントとして書き直したくありません。ストアドプロシージャは頻繁に変更されるため、実行できません。

4

9 に答える 9

3

ストアドプロシージャの動作に応じて、@@ ROWCOUNTは、SPが実行するすべての結果(更新を含む)の結果の数を返します:http: //msdn.microsoft.com/en-us/library/ms187316.aspx

これは、spで最後に行うことがクライアントに行を返す場合にのみ機能します...それ以外の場合は、他のステートメントの結果を取得します。わかる?

于 2008-09-17T04:06:08.627 に答える
1

行数を返すか(RETURNを使用)、outパラメーターを使用して値を取得できると思います。

于 2008-09-17T04:30:42.187 に答える
1

@@ ROWCOUNT

于 2008-09-17T04:05:01.203 に答える
1

outパラメータを使用する

于 2008-09-17T04:06:00.250 に答える
0

他のプロシージャを結果セットを返す単純な関数に書き直すことができる場合は、そこからcount(*)を選択するだけです。

于 2008-09-17T04:05:23.357 に答える
0

カウントを実際に知る必要はなく、sprocのデータがあるかどうかだけを考えると、次のようなものをお勧めします。

CREATE PROCEDURE subProcedure @param1, @param2, @Param3 tinyint OUTPUT
AS
BEGIN
  IF EXISTS(SELECT * FROM table1 WHERE we have something to work with)
   BEGIN
    -- The body of your sproc
    SET @Param3 = 1
   END
  ELSE
   SET @Param3 = 0
END

これで、sprocを実行し、@Param3の値を確認できます。

DECLARE @ThereWasData tinyint
exec subProcedure 'foo', 'bar', @ThereWasData OUTPUT
IF @ThereWasData = 1 
  PRINT 'subProcedure had data'
ELSE
  PRINT 'subProcedure had NO data'
于 2008-09-17T12:30:53.873 に答える
0

私はあなたがこのようなことをすべきだと思います:

Create  Procedure   [dbo].[GetResult]   (
    @RowCount   BigInt  =   -1  Output
)   As  Begin

    /*
        You can do whatever else you should do here.
    */

    Select  @RowCount   =   Count_Big(*)
        From    dbo.SomeLargeOrSmallTable
        Where   SomeColumn  =   'Somefilters'
        ;

    /*
        You can do whatever else you should do here.
    */

    --Reporting how your procedure has done the statements. It's just a sample to show you how to work with the procedures. There are many ways for doing these things.
    Return  @@Error;

End;

これを書き込んだ後、次のような出力結果を得ることができます。

Declare @RowCount   BigInt
,   @Result     Int
;

Execute @Result =   [dbo].[GetResult]   @RowCount   Out

Select  @RowCount
,   @Result
;

乾杯

于 2012-10-09T17:01:08.310 に答える
0
  create proc test
    as
    begin
     select top 10 * from customers
    end
    go


    create proc test2 (@n int out)
    as
    begin
    exec test
    set @n = @@rowcount
    --print @n
    end
    go

    declare @n1 int =0

    exec test2 @n1 out
    print @n1
    --output result: 10
于 2016-09-01T22:52:39.930 に答える
0

他の誰かが他のストアド プロシージャを変更しているようで、そのようなプロシージャへの変更に関係なく、結果を効果的にチェックする何かが必要です。

tempt テーブルを作成し、そのプロシージャの結果をそこに挿入します。

次に、結果に対して行カウントを実行できます。あなたの問題を正しく理解していれば、それは最も効率的ではありませんが、最も信頼できる解決策です.

スニペット:

DECLARE @res AS TABLE (
    [EmpID] [int] NOT NULL,
    [EmpName] [varchar](30) NULL,
    [MgrID] [int] NULL
)

INSERT @res 
EXEC dbo.ProcFoo

SELECT COUNT(*) FROM @res
于 2008-09-17T05:01:05.297 に答える