2011-12-08 17 views
1

私は初心者の質問があります。初心者:whileループの外で "With"を使用していますか?

declare @RowNr int = 1 
declare @CA int = 0 

While @RowNr <= 1000 
BEGIN 
    With CCWithRow AS 
    (
     SELECT CA ,ROW_NUMBER() OVER (order by CA) as RowNr 
     FROM myCATable 
    ) 

    SELECT @CA = CA, @RowNr = RowNr 
    FROM CCWithRow 
    WHERE RowNr = @RowNr 
    Set @RowNr += 1 

--Doing something with @CA here 
END 

このコードではありません:

これは動作するコードの一部です

declare @RowNr int = 1 
    declare @CA int = 0 

    With CCWithRow AS 
    (
      SELECT CA ,ROW_NUMBER() OVER (order by CA) as RowNr 
     FROM myCATable 
    ) 

    While @RowNr <= 1000 
    BEGIN 
     SELECT @CA = CA, @RowNr = RowNr 
     FROM CCWithRow 
     WHERE RowNr = @RowNr 
     Set @RowNr += 1  
--Doing something with @CA here 
    END 

質問:なぜ私はループ内WITH「を定義」しなければなりませんの?

私は元の問題を解決するためのより良い方法があることを知っていますので、それは問題ではありません。ちょうど知りたい、なぜ私はループの外側にWITHを定義して内部で使用することができないのですか?

答えて

2

From BOL

共通テーブル式(CTE)はDELETE、単一 SELECT、INSERT、UPDATE の実行範囲内で定義されている一時的 結果セットと考えることができ、またはCREATE VIEWステートメント。それはどこにも参照するように範囲内にないよう

だから共通テーブル式の使用量は、常に CTE定義の終了直後に行われなければなりません。この場合も例外ではありません。 CTEの実装ザッツ

1

CTEだけすぐ はCTEに従うことを声明で参照することができます。これは、CTEを使用する場合は、 のCTEの直後のCTEを参照するクエリを、 のT-SQLバッチで記述する必要があることを意味します。 (ref

CTEの結果は非常に同様にあなたが他の場所でアクセスすることはできません(select ..)サブクエリのように、作成されたオブジェクト、CTE表現の構文解析に基づいて結果をそのセットだけではありません。

+0

ありがとうございました、「オブジェクトではありません」とは私が理解していることです。マーティンをもっと速く選んでいます。 ;) – Feroc

1

チェックMSDNで次の文Common Table Expressions共通テーブル式(CTE)はwithin the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.

それはオブジェクトとして格納されていないを定義し、持続される一時的な結果セットとして考えることができ

クエリの実行中のみ有効です。先行する選択ステートメント のCTE式の後すぐに解放されます。

CTEの詳細については、Microsoft Magazineの記事 - Structure of a CTEを参照してください。

CTEは、言語レベルの構造です。つまり、SQL Serverでは が内部的に一時テーブルまたは仮想テーブルを作成しません。 CTEの基本クエリ は、直後の クエリで参照されるたびに呼び出されます。

+0

良い記事、ありがとう。 – Feroc

関連する問題