recursive - ¿Cómo puedo usar la instrucción if después de un CTE(SQL Server 2005)
with as() sql (4)
Anoche estaba escribiendo un simple programa T-SQL algo como esto
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
Encontré después de la compilación que está arrojando un error algo así como "Declaración incorrecta cerca de si"
¿Qué está mal?
Sin embargo, lo hice usando otra forma. ¡Pero quería saber por qué no funcionó!
Intenta poner el CTE en el SI. Funciono para mi
SI @wsome = 1 COMIENZA; CON CTE COMO (SELECCIONAR * DE ALGUNO) SELECCIONA ''WHATEVERYOUWANT'' DE CTE END ELSE
Lo más cercano que obtendrás es usar UNION ALL para hacer una selección bruta cambiada:
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
Un poco tarde, pero no puedo ser el único que tropiece con esto.
Una solución podría ser crear una tabla temporal como esta:
-- 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
Las expresiones de tabla comunes se definen dentro del contexto de una sola declaración:
WITH cte_name AS (
<cte definition>)
<statement that uses cte>;
Así que puedes hacer algo como:
WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
SELECT * FROM CTE;
o
WITH CTE
AS
(
SELECT * FROM SOMETABLE
)
UPDATE CTE
SET somefield = somevalue
WHERE id = somekey;
Un CTE debe ir seguido de una sola instrucción SELECT, INSERT, UPDATE, MERGE o DELETE que haga referencia a algunas o todas las columnas CTE. Un CTE también se puede especificar en una sentencia CREATE VIEW como parte de la sentencia SELECT de definición de la vista