5

ストアド プロシージャの以前のクエリに基づいて、削除句と挿入句を含むストアド プロシージャに取り組んでいます。

まず、WITH ステートメントから始めて、いくつかの複雑なクエリを単純な CTE に構築し、delete および insert ステートメントで使用できるようにします。

ただし、CTE の後に挿入ステートメントと削除ステートメントの両方を実行できないようです。

サンプルコード:

WITH temp AS (SELECT id, name FROM myDBTable)
DELETE FROM thisTable WHERE .....(based on "temp")
INSERT INTO otherTable (id, name) FROM (based on "temp")

MSDNによると:

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

それは「単一の」..ステートメントを言います。複数の選択/削除/などを行うことはできませんか? そうでない場合、これを回避する方法はありますか?

個別に両方のクエリが機能しますが、単一のストアド プロシージャでその CTE を使用して両方を実行できますか?

4

3 に答える 3

5

DELETE と Insert Query の両方で同じ条件を使用している場合は、これを試すことができます

WITH temp AS (SELECT id, name FROM myDBTable)
DELETE FROM thisTable 
OUTPUT deleted.id, deleted.name into otherTable 
WHERE .....(based on "temp")
于 2013-10-01T19:52:50.193 に答える
1

Common Table Expression とのマージを使用できます。これを実現する方法の例を以下に示します。

例:

;WITH cte AS
(
 SELECT id,
      name
 FROM [TableA]
)

MERGE INTO [TableA] AS A
 USING cte
    ON cte.ID = A.id

  WHEN MATCHED 
  THEN DELETE

  WHEN NOT MATCHED 
  THEN INSERT
VALUES(cte.name);
于 2017-10-19T07:58:42.080 に答える