Как я могу использовать оператор 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
После компиляции я обнаружил, что он выдает ошибку примерно как "Неверное утверждение рядом, если"
Что не так?
Однако я сделал это, используя другой способ. Но я хотел знать, почему это не сработало!
Ответы
Ответ 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 КОНЕЦ