2017-12-07 5 views
2

出力として複数の結果セットを持つストアドプロシージャが30〜40個あります。私の実際の要件は、SQL Serverのそれぞれのプロシージャからの各結果セットの行数を数えることです。ストアドプロシージャの複数の結果セットを異なるテーブルに格納します。

手順を変更して、結果セットごとにcount()を使用することができます。しかし、実際には30から40の手続きを変更するのは面倒な仕事です。むしろ私はopenqueryプロセスを使用して、プロシージャの出力をいくつかの一時テーブルに格納しようとしていた同じことをしています。

しかし、このようにして、私は最初の結果セットのみを保存することができます。それ以降の結果セットは保存できません。でも、私はカーソルを使って同じことを達成しようとしていましたが、うまくいきません。あなたは何とか私を助けてくれますか?ここ

create table Orders 
    (
     Slno int, 
     OrderID Char(20), 
     NumberOfItem int, 
     CustomerID int 
    ) 

    Create table Customer 
       (
        CustomerID int, 
      CustomerName Char(30), 
        Address nChar(50) 
       ) 

    Insert into Customer values (1,'Piyu','Bhubaneswar'), 
         (2,'Ranu','Bhubaneswar'), 
         (3,'Tiku','Cuttack'), 
         (4,'Lui','Bhadrak'), 
         (5,'Wasim','Bhadrak'), 
         (6,'Vivek','Dhekanal'), 
         (7,'Romeo','Puri') 

    Insert into Orders Values (1,'O1',2,1), 
           (2,'O2',7,1), 
       (3,'O3',20,4), 
       (4,'O4',2,3), 
       (5,'O5',3,3), 
        (6,'O6',1,7), 
       (7,'O7',1,5), 
         (8,'O8',3,1), 
       (9,'O9',2,6) 

    Select * from Orders 
    Select * from Customer     

    Alter Procedure OrderDetails 
    @Var_TotalItems Int 

    As 
    Begin 

     Select C.CustomerName,C.[Address ],O.NumberOfItem,O.OrderID From 
     Customer C 
     Join 
     Orders O 
     On C.CustomerID=O.CustomerID 

     Select C.CustomerName,Sum(O.NumberOfItem) 
     [TotalNumberOfItem],Count(O.OrderID) [TotalNumberOfOrders] From 
     Customer C 
     Join 
     Orders O 
     On C.CustomerID=O.CustomerID 
     Group by C.CustomerName 
     Having Sum(O.NumberOfItem) >= @Var_TotalItems 
    End 

     EXEC OrderDetails 4 

手順複数の出力を返す:ここ

コードです。私の目的は、ストアドプロシージャを変更せずに各出力の行数を数えることです。

+0

申し訳ありません私の答えだったwrong.youは、ストアproc.iが同じにあなたのrequirement.Passing異なるパラ値について確認していない実行するためにOPENROWSET(「」)をグーグル必要がありますprocは別のrowcountを返すことができます。また、すべてのprocは異なるパラメータを受け入れ、そのデータ型は異なります。あなたがパラメータとして日付を受け入れるprocをもう1つ選択します。 – KumarHarsh

+0

私は既にopenrowset()で試してみました。最初の結果セットのみを取得しますが、後のセットは取得しません。 私の要件を達成するためにループやカーソルを使用する方法はありますか? –

+0

あなたはシナリオ全体を説明していません。私は正しい方法で元の要件をカバーしていることを願っています。ただ1つの解決策しか見ていません。フロントエンドとしてc#,. netを使用していれば、フロントエンドからprocを実行し、あなたはdataset.thenを使用することができます。テーブル[0] .rows.count、dataset.Table [1] .rows.countなど。 – KumarHarsh

答えて

0

システム変数@@ ROWCOUNTを使用すると、クエリの影響を受ける行数を取得できます。

@@ ROWCOUNTの値は、最後のステートメント(select/insert/update/delete)の影響を受ける行数で更新されます。ストアドプロシージャの実行後に、@@ ROWCOUNTの値をチェックして、プロシージャから返された行数を取得できます。ここでは、この

declare @c int 
exec OrderDetails 
select @c [email protected]@Rowcount 

select @c 

のような手続きたOrderDetailsによって返される行のノーは、ユーザー定義変数@cに格納され、あなたは他の操作のための同じを使用することができます。

@@ ROWCOUNTの詳細についてはthis Linkを参照してください

+0

@@ Rowcountは、最後のステートメント(select/insert/update/delete)の影響を受けるow数を返します。しかし、前の行数も追跡する必要があります。私の手続きでは、結果セットに複数の出力があります。だから私は、ストアドプロシージャを変更せずにすべての結果セットから行数を数えたいと思う。 –

+0

一時テーブルまたはテーブル変数にそれらを挿入して、必要に応じて後で任意の順序でフェッチできるようにしてください。 –

+0

私はすでに結果セットをTempテーブルに挿入しようとしました。ただし、最初の結果のみを取得するtempテーブルは後で設定しません。 –

関連する問題