18

Letzte Nacht war ich wie diesesWie kann ich, wenn Anweisung nach einem WAK (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 

ich nach der Kompilierung ein einfaches T-SQL-Programm etwas zu schreiben, fand, dass es Fehler so etwas wie "wirft Falsche Aussage in der Nähe von if "

Was ist los?

Allerdings tat ich das auf eine andere Weise. Aber ich wollte wissen, warum es nicht funktioniert hat!

+0

Was in jedem Fall nicht // SOMECODE tun? Wenn es sich beispielsweise um UPDATE-Anweisungen handelt, die alle auf dieselbe Tabelle abzielen, können Sie möglicherweise den prozeduralen Code mit der @ROLEID-Variablen weglassen und stattdessen ein einzelnes UPDATE mithilfe eines satzbasierten Ansatzes schreiben. – onedaywhen

+0

Eigentlich wähle ich die Datensätze wie Select * aus Tblname. keine DML-Operationen –

Antwort

19

Common table expressions werden im Rahmen einer einzigen Anweisung definiert:

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

So können Sie so etwas wie tun:

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

Ein CTE muss

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

oder

sein gefolgt von einer einzigen SELECT, INSERT, UPDATE, MERGE oder DELETE-Anweisung, die auf einige oder alle CTE-Spalten verweist. Ein CTE kann auch in einer CREATE VIEW Anweisung als Teil der Definition von SELECT-Anweisung der

5

Die nächste Ansicht angegeben werden, erhalten Sie, ist alles eine UNION mit einem rohen zu tun Switched wählen:

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

Für diesen Fall müssen die Spalten identisch sein. Ich habe einen Fall, in dem Spalten unterschiedlich sind. Immer noch eine Lösung finden – SarjanWebDev

2

Ein wenig zu spät, aber ich kann nicht der einzige sein, der darauf stößt.

könnte eine Lösung, die eine temporäre Tabelle wie diese zu erstellen sein:

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