2017-07-16 10 views
0

NET 3.5のWinForms C#アプリケーションからSQL Serverのストアドプロシージャを呼び出します。SQL Serverが返すのは1 resultset

従業員は、いくつかの条件を満たして個別にするかどうか
CREATE PROCEDURE [dbo].[HasRights] 
    @Id char(10), 
    @dept char(4) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @nRows int 
    DECLARE @HasRights BIT 

    SET @HasRights = 0 

    SELECT e.Id, d.DeptId, p.Name 
    FROM Employees e 
    INNER JOIN depts d on e.Id = d.Id 
    INNER JOIN EmpData p on e.Id = p.Id 
    LEFT JOIN OldEmployees o ON e.Id = o.Id 
    WHERE e.Id = @Id 
     AND o.Id IS NULL 
     AND d.DeptId = @dept 
     AND e.Type in (100, 200, 300) 

    SET @nRows = @@ROWCOUNT  --SCOPE_IDENTITY() would also work 

    IF @nRows > 0 
    BEGIN 
     SET @HasRights = 1 
    END 
    ELSE 
    BEGIN 
     SELECT e.Id, d.DeptId, p.Name 
     FROM Employees e  
     INNER JOIN depts d on e.Id = d.Id 
     INNER JOIN EmpData p on e.Id = p.Id 
     WHERE e.Id = @Id 
      AND d.DeptId = @dept 
    END 

    RETURN @HasRights 
END 

(最初の結果セット:

このストアドプロシージャは、常に0または1ここで

である私のストアドプロシージャに設定し、結果セットと戻り変数を返す必要があります)、同じデータが返されます。条件が成立したときに最初の結果セットが返され、最初の結果セットの条件が満たされずに最初の結果セットの戻り変数@HasRightsが1に設定され、2番目の結果セットが0に設定されているときに、私にそれらを区別するために#コードからアイコンや絵文字ボックス内の別のものを見せてください。

ここで私の問題は、最初の結果セットまたは2番目の結果セットを返すためにストアプロシージャが必要ですが、同時に両方ではありません。たとえば、最初の選択の条件が満たされない場合、空のデータセットが返され、その後に2番目の選択(空ではない)の結果セットが返されます。この場合、2番目の選択セットの2番目の結果セットのみが返されます(最初は空ではありません)。だからそれを行う方法?

は、私は、まず最初に以下のように選択するために存在し使用することができます知っている:

CREATE PROCEDURE [dbo].[HasRights] 
    @Id char(10), 
    @dept char(4) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @nRows int 
    DECLARE @HasRights BIT 

    SET @HasRights = 0 

    IF EXISTS(SELECT e.Id, d.DeptId, p.Name 
       FROM Employees e 
       INNER JOIN depts d on e.Id = d.Id 
       INNER JOIN EmpData p on e.Id = p.Id 
       LEFT JOIN OldEmployees o ON e.Id = o.Id 
       WHERE e.Id = @Id 
       AND o.Id IS NULL 
       AND d.DeptId = @dept 
       AND e.Type in (100, 200, 300)) 
    BEGIN 
     SELECT e.Id, d.DeptId, p.Name 
     FROM Employees e 
     INNER JOIN depts d on e.Id = d.Id 
     INNER JOIN EmpData p on e.Id = p.Id 
     LEFT JOIN OldEmployees o ON e.Id = o.Id 
     WHERE e.Id = @Id 
     AND o.Id IS NULL 
     AND d.DeptId = @dept 
     AND e.Type in (100, 200, 300)    

     SET @HasRights = 1 
    END 
    ELSE 
    BEGIN 
     SELECT e.Id, d.DeptId, p.Name 
     FROM Employees e  
     INNER JOIN depts d on e.Id = d.Id 
     INNER JOIN EmpData p on e.Id = p.Id 
     WHERE e.Id = @Id 
      AND d.DeptId = @dept 
    END 

    RETURN @HasRights 
END 

このアプローチの問題は、最初の2回繰り返す選択することである:それが存在する場合、それが存在する二かどうかをチェックする際に最初に結果セットを返すために、私はこれを避けたい。

アイデア?

+1

あなたが最初のテーブル変数にそれを選択して、テーブル変数からそれを返すことができます。おそらく既にキャッシュされているので、2回実行するかどうかは関係ありません。 –

+0

おそらく、WHERE句を使って動作させる方法がありますが、私はあなたのロジックを理解していません。 –

+0

結果セットを見て、従業員HasRightsの場合は、1つのクエリを使用してC#で決定する可能性があります。ところで、あなたは '@ HasRights'を返さないので、とにかくやっていることは何ですか? – Crowcoder

答えて

1

は最後に、私は、次のいずれかにストアドプロシージャを書き換えています

CREATE PROCEDURE [dbo].[HasRights] 
    @Id char(10), 
    @dept char(4) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @HasRights BIT 

    SET @HasRights = 0 

    IF EXISTS(SELECT TOP 1 
       FROM Employees e 
        INNER JOIN depts d on e.Id = d.Id 
        INNER JOIN EmpData p on e.Id = p.Id 
        LEFT JOIN OldEmployees o ON e.Id = o.Id 
       WHERE e.Id = @Id 
         AND 
        o.Id IS NULL 
         AND 
        d.DeptId = @dept 
         AND 
        e.Type in (100, 200, 300)) 
      ) 
    BEGIN 
     SET @HasRights = 1 
    END 

    SELECT e.Id, d.DeptId, p.Name 
    FROM Employees e 
      INNER JOIN depts d on e.Id = d.Id 
      INNER JOIN EmpData p on e.Id = p.Id    
    WHERE e.Id = @Id 
      AND 
      d.DeptId = @dept  

    RETURN @HasRights  
END 
+0

これは、最初に投稿されたクエリと同じ機能を持つようには見えません。そうであれば、それはあなただけが知っている何らかの情報が原因です。 –

関連する問題