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回繰り返す選択することである:それが存在する場合、それが存在する二かどうかをチェックする際に最初に結果セットを返すために、私はこれを避けたい。
アイデア?
あなたが最初のテーブル変数にそれを選択して、テーブル変数からそれを返すことができます。おそらく既にキャッシュされているので、2回実行するかどうかは関係ありません。 –
おそらく、WHERE句を使って動作させる方法がありますが、私はあなたのロジックを理解していません。 –
結果セットを見て、従業員HasRightsの場合は、1つのクエリを使用してC#で決定する可能性があります。ところで、あなたは '@ HasRights'を返さないので、とにかくやっていることは何ですか? – Crowcoder