webentwicklung-frage-antwort-db.com.de

Wie kann ich die if-Anweisung nach einem CTE verwenden? (SQL Server 2005)

Letzte Nacht habe ich so etwas wie ein einfaches T-SQL-Programm geschrieben

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 habe nach dem Kompilieren festgestellt, dass es einen Fehler wie "Falsche Anweisung in der Nähe von if" gibt.

Was ist falsch?

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

21
priyanka.sarkar

Allgemeine Tabellenausdrücke werden im Kontext einer einzelnen Anweisung definiert:

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

Sie können also Folgendes tun:

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

oder

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

Einem CTE muss eine einzelne SELECT-, INSERT-, UPDATE-, MERGE- oder DELETE-Anweisung folgen, die auf einige oder alle CTE-Spalten verweist. Ein CTE kann auch in einer CREATE VIEW-Anweisung als Teil der definierenden SELECT-Anweisung der Ansicht angegeben werden

23
Remus Rusanu

Das nächste, was Sie bekommen, ist die Verwendung von UNION ALL, um eine rohe geschaltete Auswahl zu treffen:

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

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

Eine Lösung könnte darin bestehen, eine temporäre Tabelle wie folgt zu erstellen:

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

Versuchen Sie, den CTE in die IF zu setzen. Es hat bei mir funktioniert.

IF @awsome = 1 BEGIN; WITH CTE AS (SELECT * FROM SOMETABLE) SELECT 'WHATEVERYOUWANT' FROM CTE END ELSE IF @awesome = 2 BEGIN; WITH CTE2 AS (SELECT * FROM SOMETABLE) SELECT 'WHATEVERYOUWANT' FROM CTE2 END

0
CW1255