回答:
最初にCTEを配置してから、INSERT INTOを選択ステートメントと組み合わせる必要があります。また、CTEの名前に続く「AS」キーワードはオプションではありません。
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
このコードは、CTEが正確に4つのフィールドを返すこと、およびこれらのフィールドがINSERTステートメントで指定されたフィールドと順序とタイプが一致していることを前提としていることに注意してください。そうでない場合は、「SELECT *」を必要なフィールドの特定の選択に置き換えてください。
関数の使用についてのあなたの質問については、私は「それは依存する」と言います。パフォーマンス上の理由でデータをテーブルに配置し、関数を介してそれを使用するときに速度が許容できる場合は、関数をオプションと見なします。一方、CTEの結果をいくつかの異なるクエリで使用する必要があり、速度が既に問題となっている場合は、表(通常または一時)を使用します。
WITH
共通テーブル式の節が上部にあります。
CTEですべての挿入をラップすると、列のマッピングからクエリロジックを視覚的に分離できるという利点があります。
間違いを見つけます:
WITH _INSERT_ AS (
SELECT
[BatchID] = blah
,[APartyNo] = blahblah
,[SourceRowID] = blahblahblah
FROM Table1 AS t1
)
INSERT Table2
([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]
FROM _INSERT_
同じ間違い:
INSERT Table2 (
[BatchID]
,[SourceRowID]
,[APartyNo]
)
SELECT
[BatchID] = blah
,[APartyNo] = blahblah
,[SourceRowID] = blahblahblah
FROM Table1 AS t1
数行のボイラープレートにより、非常に多数の列がある場合でも、コードが正しい数の列を正しい順序で挿入していることを確認するのが非常に簡単になります。あなたの将来の自己は後であなたに感謝します。