1

重複の可能性:
キーワード'with'の近くの構文が正しくありません…前のステートメントはセミコロンで終了する必要があります

階層データを選択してテーブルに挿入したい。したがって、挿入でWITHステートメントを使用する必要があります。

これは正常に機能します。

create table test_table
(
 id int
)   

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

しかし、これは「WITHキーワードの近くの間違った構文」エラーを生成します:

CREATE PROCEDURE p_insert_test
AS
BEGIN

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

END

T-SQLはINSERTキーワードの前のWITHキーワードが好きではないと思います。ストアドプロシージャでこの種の挿入を行うにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

5

CTE宣言は、バッチの最初のコマンドである必要があります。

の前にセミコロンを付けるだけWITHで問題ありません。

;WITH t_Table...

編集:

これが当てはまる理由を明確にするために、キーワードは、、WITHなどのクエリヒントにも使用されます。クエリエンジンはキーワードの意図を知る必要があり、それがaを表すことを示す唯一の方法は次のことを確認することです。宣言がバッチの始まりであること。WITH RECOMPILEWITH (NOLOCK)WITHCTECTE

そうしないと、次のようなあいまいなことが発生する可能性があります。

SELECT Field
FROM MyTable
WITH CteName
As
(Select 1)

ステートメントターミネータがないと、CteNameに適用されるクエリヒントとして不適切に読み取られますMyTable

于 2011-12-12T16:00:53.557 に答える