Хранимая процедура If - PullRequest
       36

Хранимая процедура If

0 голосов
/ 23 сентября 2018

Я хочу, чтобы sp использовал условный параметр, такой как

CREATE PROCEDURE spTest
(
    @param1 DATE,
    @param2 DATE,
    @param3 NVARCHAR(8) = null
)

AS

IF (@param3 = 'test1')
BEGIN
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM db1 GROUP BY a
END

WITH innerQuery1 AS
(
    SELECT a, b, c FROM db2 WHERE a >=@param1 AND a <= @param2
)
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM innerQuery1 GROUP BY a

Я знаю, что это очень обобщенно, но этот процесс работает.То, что я пытаюсь сделать, - это поставить условное «посередине», например.

CREATE PROCEDURE spTest
(
    @param1 DATE,
    @param2 DATE,
    @param3 NVARCHAR(8) = null
)

AS

WITH innerQuery1 AS
(
    SELECT a, b, c FROM db2 WHERE a >=@param1 AND a <= @param2
)

IF (@param3 = 'test1')
BEGIN
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM db1 GROUP BY a
END

    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM innerQuery1 GROUP BY a

То, что происходит, теперь он больше не может видеть innerQuery1.Разве у вас нет условного выражения в WITH?

Есть идеи, почему оно не работает?Мой фактический запрос намного длиннее и больше вложенных запросов.В основном, в этом случае мы пытаемся использовать только один sp и использовать результаты запросов на основе параметра.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если я правильно понимаю ваше намерение, вы можете подумать о каком-то ином подходе, например разделении тестовых наборов на отдельные SP и составлении из них наборов тестов:

CREATE PROC TestSuite_CheckAggregations
    @arg,
    @param1, @param2
as
  ...
  SET @testCase = CASE @arg 
     WHEN '1' THEN 'TestCase_1_innerQuery'
     WHEN '2' THEN `TestCase_2_DirectQuery`
  END
  ...
  EXEC @testCase
    @param1, @param2
  ...
END



CREATE PROC TestCase_1_innerQuery
...

CREATE PROC TestCase_2_DirectQuery
...

Возможно, было бы полезно создатьсистема тестирования на языке / фреймворке, которая поддерживает такие вещи естественным образом.

0 голосов
/ 23 сентября 2018

Попробуйте создать свою процедуру как:

CREATE PROCEDURE spTest
(
    @param1 DATE,
    @param2 DATE,
    @param3 NVARCHAR(8) = null
)

AS

IF (@param3 = 'test1')
BEGIN
    SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM db1 GROUP BY a
END
    ELSE
        BEGIN
            WITH innerQuery1 AS
            (
                SELECT a, b, c FROM db2 WHERE a >=@param1 AND a <= @param2
            )
                SELECT a, SUM(b) AS SumOfB, SUM(c) AS SumOfC FROM innerQuery1 GROUP BY a;
        END
GO
...