with recursive recursivas expresiones ejemplo cte consultas comando sql sql-server sql-server-2005 tsql common-table-expression

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