28

昨夜、私はこのような単純なT-SQLプログラムを書いていました

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

コンパイル後、「ifの近くのステートメントが正しくありません」のようなエラーがスローされていることがわかりました

なにが問題ですか?

しかし、私は他の方法を使用してそれを行いました。しかし、なぜそれが機能しなかったのか知りたかったのです!

4

4 に答える 4

25

一般的なテーブル式は、単一のステートメントのコンテキスト内で定義されます。

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

したがって、次のようなことができます。

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

また

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

CTEの後には、一部またはすべてのCTE列を参照する単一のSELECT、INSERT、UPDATE、MERGE、またはDELETEステートメントが続く必要があります。CTEは、ビューのSELECTステートメントを定義する一部としてCREATEVIEWステートメントで指定することもできます。

于 2009-10-13T04:17:29.940 に答える
11

最も近いのは、UNIONALLを使用して大まかなスイッチドセレクトを実行することです。

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
于 2009-10-13T04:31:05.433 に答える
9

少し遅れましたが、これにぶつかるのは私だけではありません。

解決策は、次のような一時テーブルを作成することです。

-- 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
于 2016-03-07T10:47:05.787 に答える
2

CTEをIFに入れてみてください。それは私のために働いた。

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
于 2018-12-21T18:23:33.567 に答える