Подтвердить что ты не робот

Как я могу использовать оператор if после CTE (SQL Server 2005)

Вчера вечером я написал простую программу T-SQL примерно так:

DECLARE @ROLEID AS INT

SELECT @ROLEID = [ROLE ID] FROM TBLROLE

;WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)
IF (@ROLEID  = 1) 
BEGIN
      //SOMECODE
END
ELSE IF(@ROLEID  = 2) 
BEGIN
      //SOMECODE
END
ELSE
BEGIN 
      //SOMECODE
END

После компиляции я обнаружил, что он выдает ошибку примерно как "Неверное утверждение рядом, если"

Что не так?

Однако я сделал это, используя другой способ. Но я хотел знать, почему это не сработало!

4b9b3361

Ответ 1

Общие выражения таблицы определяются в контексте одного оператора:

WITH cte_name AS (
  <cte definition>)
<statement that uses cte>;

Итак, вы можете сделать что-то вроде:

WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)
SELECT * FROM CTE;

или

WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)
UPDATE CTE 
SET somefield = somevalue
WHERE id = somekey;

За CTE должен следовать один SELECT, INSERT, UPDATE, MERGE или Вызов DELETE, который ссылается на некоторые или всех столбцов CTE. CTE также может указывать в CREATE VIEW как часть определяющего Выражение SELECT представления

Ответ 2

Самое близкое, что вы получите, это использовать UNION ALL для выбора грубого переключателя:

DECLARE @ROLEID AS INT

SELECT @ROLEID = [ROLE ID] FROM TBLROLE

;WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)
SELECT
    --somecolumns
FROM
    CTE
    --other stuff too
WHERE
    @ROLEID = 1
UNION ALL
SELECT
    --somecolumns
FROM
    CTE
    --other stuff too
WHERE
    @ROLEID = 2
UNION ALL
SELECT
    --somecolumns
FROM
    CTE
    --other stuff too
WHERE
    @ROLEID = 3
...
UNION ALL
SELECT
    --somecolumns
FROM
    CTE
    --other stuff too
WHERE
    @ROLEID = n

Ответ 3

Немного поздно, но я не могу быть единственным, кто сталкивается с этим.

Решением может быть создание временной таблицы следующим образом:

-- If previous run of this query fails, the temp table will be deleted.
-- Selecting into creates the temp table which fails if it already exists
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#dtBalansOpgesteldGefilterd%') BEGIN
   DROP TABLE #temp
END;

;WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)

-- Followed by select statement as required
SELECT *
INTO #temp
FROM CTE

IF @awsome = 1
BEGIN
    SELECT 'WHATEVERYOUWANT' AS WhateverColumnNameYouWant, *
    FROM #temp
END

Ответ 4

Попробуйте положить CTE в IF. Это сработало для меня.

IF @awsome = 1 НАЧАТЬ; С CTE КАК (ВЫБРАТЬ * ИЗ НЕОБХОДИМОСТИ) ВЫБЕРИТЕ "WHATEVERYOUWANT" ИЗ КОНЕЦ ДАЛЕЕ, ЕСЛИ ЕСЛИ @awesome = 2 НАЧИНАЕТСЯ, С CTE2 КАК (ВЫБРАТЬ * ОТ НЕКОТОРЫЕ) ВЫБРАТЬ "WHATEVERYOUWANT" ИЗ СТЕ2 КОНЕЦ