2017-07-16 235 views
0

從我的WinForms .NET 3.5中的C#應用​​程序調用SQL Server中的存儲過程。SQL Server只返回1個結果集

此存儲的過程必須返回總是一個結果集和返回變量設置爲0或1。

這是我的存儲過程:

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 

僱員獨立是否滿足某些條件(第一個結果集)或不是,返回相同的數據。條件滿足時返回第一個結果集,當第一個結果集的條件不滿足時返回第二個結果集,但不同的是,第一個結果集返回變量@HasRights設置爲1,第二個結果集設置爲0。讓我從c#代碼中區分出一個圖標或一個圖片框中的另一個圖標。

我在這裏的問題是,我需要存儲過程返回第一個結果集或第二個,但不是在同一時間。例如,當第一次選擇的條件不滿足時,它會返回一個空數據集,然後返回第二次選擇的結果集(非空)。在這種情況下,我只需要返回第二個結果集(不是第一個空)。那麼該怎麼做呢?

我知道我首先可以使用一個存在的第一選擇如下:

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 

這種方法的問題是,首先選擇重複兩次:第一次檢查時,如果存在,第二,如果存在爲了返回結果集,我想避免這種情況。

任何想法?

+1

你可以先選擇到一個表變量,並從表變量返回。事情是它可能已經被緩存了,所以如果你運行兩次它並不重要。 –

+0

可能有辦法擺弄你的'WHERE'子句,使其工作,但我不明白你的邏輯 –

+0

我想我可能會使用一個查詢,並通過查看結果集在c#中確定員工HasRights。順便說一句,你不會返回'@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

這似乎沒有與最初發布的查詢具有相同的功能。如果確實如此,那麼這是因爲你只知道一些信息。 –