從我的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
這種方法的問題是,首先選擇重複兩次:第一次檢查時,如果存在,第二,如果存在爲了返回結果集,我想避免這種情況。
任何想法?
你可以先選擇到一個表變量,並從表變量返回。事情是它可能已經被緩存了,所以如果你運行兩次它並不重要。 –
可能有辦法擺弄你的'WHERE'子句,使其工作,但我不明白你的邏輯 –
我想我可能會使用一個查詢,並通過查看結果集在c#中確定員工HasRights。順便說一句,你不會返回'@HasRights',所以無論如何該做什麼好? – Crowcoder