Как заблокировать возврат набора результатов из хранимой процедуры? - PullRequest
0 голосов
/ 15 ноября 2009

У меня есть хранимая процедура, которая возвращает несколько наборов результатов, это выглядит примерно так

BEGIN
    SET NOCOUNT ON;

    SELECT c1, c2, c3
    FROM t1
    WHERE id = @id

    IF (@@ROWCOUNT = 0)
    BEGIN
        SELECT c1, c2, c3
        FROM t2
        WHERE id = @id
    END
END

Я использую эту хранимую процедуру на своем внешнем веб-сайте ASP.NET.

Если первый оператор SELECT не вернул никаких строк, я получаю 2 набора результатов (1-й, очевидно, пустой) в моем SqlDataReader. Есть ли способ вернуть только набор результатов из последнего оператора SELECT?

Ответы [ 5 ]

3 голосов
/ 15 ноября 2009

Пара вариантов, которые вы можете выбрать здесь, вам нужно протестировать в вашей среде, чтобы увидеть, какой из них лучше всего работает.

Первый вариант - заключить первый оператор в блок if, аналогично тому, что вы сделали со вторым блоком:

BEGIN
    SET NOCOUNT ON;

    if exists
    (
        SELECT c1, c2, c3
        FROM t1
        WHERE id = @id  
    )
    begin
        SELECT c1, c2, c3
        FROM t1
        WHERE id = @id
    end
    else
    begin
        SELECT c1, c2, c3
        FROM t2
        WHERE id = @id
    END
END

Второй вариант - использовать временную таблицу / переменную:

BEGIN
    SET NOCOUNT ON;

    declare @t1 table (c1 int, c2 int, c3 int)

    insert @t1 (c1,c2,c3)
    SELECT c1, c2, c3
    FROM t1
    WHERE id = @id  

    IF (@@ROWCOUNT = 0)
    BEGIN
        SELECT c1, c2, c3
        FROM t2
        WHERE id = @id
    END
    ELSE
    BEGIN
        select c1,c2,c3
        from @t1
    end

END
3 голосов
/ 15 ноября 2009

Немного отличаясь от других хороших ответов, вы можете использовать объединение:

SELECT c1, c2, c3 FROM t1 WHERE id = @id
UNION ALL
SELECT c1, c2, c3 FROM t2 WHERE id = @id
AND NOT EXISTS (
    SELECT * FROM t1 WHERE id = @id
)
1 голос
/ 15 ноября 2009

Не усложняйте:

BEGIN        

SET NOCOUNT ON;        

if exists (SELECT 1 FROM t1 WHERE id = @id)

  SELECT c1, c2, c3                
  FROM t1
  WHERE id = @id

else        

  SELECT c1, c2, c3
  FROM t2
  WHERE id = @id

END
1 голос
/ 15 ноября 2009
DECLARE @Count int;

SELECT @Count = Count(*)
FROM t1
WHERE id = @id


IF(@Count = 0)
BEGIN

SELECT c1, c2, c3
FROM t2
WHERE id = @id

END
ELSE
BEGIN

SELECT c1, c2, c3
FROM t1
WHERE id = @id

END
0 голосов
/ 15 ноября 2009
;
WITH
rws_1 AS(
    SELECT c1, c2, c3 FROM t1 WHERE id = @id
),
rws_2 AS(
    SELECT c1, c2, c3 FROM t2 WHERE id = @id
)
SELECT * FROM rws_1
UNION ALL
SELECT * FROM rws_2 WHERE NOT EXISTS(SELECT * FROM rws_1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...