Как я могу использовать оператор 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

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

Что не так?

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

13.10.2009 03:42:43
Что делает // SOMECODE в каждом случае? Если они, например, являются операторами UPDATE, предназначенными для одной и той же таблицы, то вы можете опустить процедурный код, используя переменную @ROLEID, и вместо этого написать одну UPDATE, используя подход, основанный на множестве.
onedaywhen 13.10.2009 07:48:28
На самом деле я выбираю записи, как select * from tblname. никаких операций с dml
priyanka.sarkar 13.10.2009 08:35:56
вместо этого используйте временные таблицы
Moslem Ben Dhaou 4.09.2018 11:12:18
4 ОТВЕТА
РЕШЕНИЕ

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

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 представления

24
13.10.2009 04:17:29
Вы можете использовать SELECT * INTO #TempTable FROM CTE сразу после WITH CTE AS (), а затем использовать IF .... ELSE ...., который может столбцы значений из #TempTable для условий в IF, ELSE.
Shrikant Prabhu 30.11.2018 06:20:36

Самое близкое, что вы получите, это использование 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
10
13.10.2009 04:31:05
Для этого случая столбцы должны быть одинаковыми. У меня есть случай, когда столбцы разные. Все еще в поиске решения
SarjanWebDev 24.07.2013 03:15:05

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

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

-- 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
7
7.03.2016 10:47:05

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

IF @awsome = 1
BEGIN
;WITH CTE
AS
( 
    SELECT * FROM SOMETABLE
)
    SELECT 'WHATEVERYOUWANT' FROM CTE
END
ELSE IF @awesome = 2
BEGIN
;WITH CTE2
AS
( 
    SELECT * FROM SOMETABLE
)
    SELECT 'WHATEVERYOUWANT' FROM CTE2
END
2
30.05.2019 13:57:26