2011-07-27 10 views
9
WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * 
    FROM dbo.employee) 
SELECT * FROM emp_CTE 

これは範囲は、2005年

正常に動作します。

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * 
    FROM dbo.employee) 
SELECT * FROM EMPLOYEES  
SELECT * FROM emp_CTE 

emp_CTEが存在しないというメッセージが表示されます。

この問題を解決する方法はありますか?要するに プリンス

答えて

10

CTEは、後続の文の一部です。例えば

後続のステートメントは、単一SELECT/INSERT /更新/削除すること、又は(UNION、INTERSECTなどを有する)の化合物ができる

;WITH cte1 AS 
(
    select ... 
), cte2 AS 
(
    select ... 
) 
SELECT ... 
UNION 
SELECT ...; 

親指のルールがあることスコープは、次に;になるまでです。セミコロンは任意のステートメントを終了しますが、残念なことにオプションです。

上記のあなたの失敗のコードは、だから、CTEが01​​

+1

まで唯一のスコープ内にあるスタックオーバーフローの奇跡は、私は、ほぼ1030年午後現地時間ここに飲みに座ることができるということです実際にこの

...; WITH emp_CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * FROM dbo.employee) SELECT * FROM EMPLOYEES; SELECT * FROM emp_CTE; 

ですビールと私のコードが動作していないと思うと秒以内に正確に私が必要なものを見つけるのだろうか。 – wootscootinboogie

10

感謝:NO。 CTEは、次の単一のステートメントに対してのみ有効です。また、CTEの生活を「伸ばす」方法もありません。 MSDN Books Onlineから

共通テーブル式(CTE)が SELECT、INSERT、UPDATE、DELETE単一 の実行範囲内で定義されている一時的 結果セットと考えることができる

、またはCREATE VIEWステートメント。 CTEは、オブジェクトおよび がクエリの期間だけ持続するという点で、派生テーブルと同様の です。

次のことが可能です。

  • は、ビューにあなたのCTEをオンにし、あなたのクエリにそのビューを使用

    - ビューは限りが

  • ストアの結果を定義している通りご利用いただけますCTEを後で処理するための一時テーブルまたはテーブル変数に変換する

  • CTEの後のステートメントを変更して、単一のstatとして実行できるようにするement

    WITH emp_CTE AS (
    ......) 
    SELECT (list of columns) 
    FROM emp_CTE 
    INNER JOIN dbo.Employees e ON ......