2009-10-13 10 views
18

Ieri sera stavo scrivendo un semplice programma di T-SQL o meno cosìCome posso usare if dopo un CTE (SQL Server 2005)

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 

ho scoperto dopo la compilazione che sta gettando errore qualcosa come " Dichiarazione errata vicino a "

" Cosa c'è che non va?

Tuttavia, l'ho fatto usando un altro modo. Ma volevo sapere perché non ha funzionato!

+0

Cosa significa // SOMECODE fare in ogni caso? Se, ad esempio, le istruzioni UPDATE sono tutte rivolte alla stessa tabella, è possibile omettere il codice procedurale utilizzando la variabile @ROLEID e scrivere invece un singolo UPDATE utilizzando un approccio basato su set. – onedaywhen

+0

In realtà sto selezionando i record come select * da tblname. nessuna operazione dml –

risposta

19

Common table expressions sono definiti nel contesto di una singola istruzione:

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

Così si può fare qualcosa di simile:

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

o

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

Una CTE deve essere seguito da un singolo SELECT, INSERT, UPDATE, MERGE o Istruzione DELETE che fa riferimento ad alcune oa tutte le colonne CTE. Un CTE può anche essere specificato in una CREATE VIEW economico come parte della definizione SELECT della vista

5

Il più vicino si otterrà utilizza un UNION ALL per fare un grezzo a commutazione di selezione:

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 
+0

Per questo caso le colonne devono essere uguali. Ho un caso in cui le colonne sono diverse. Ancora trovando una soluzione – SarjanWebDev

2

Un po 'in ritardo, ma non posso essere l'unico a imbattersi in questo.

Una soluzione potrebbe essere quella di creare una tabella temporanea come questa:

-- 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 
Problemi correlati