带插入和删除的公用表表达式

时间:2013-10-01 19:45:58

标签: sql-server sql-server-2005 common-table-expression

我正在处理一个存储过程,该过程涉及基于存储过程中先前查询的delete和insert子句。

我从一个WITH语句开始,将一些复杂的查询构建到一个简单的CTE中,以便在delete和insert语句中使用。

但是,我似乎无法在CTE之后同时运行insert和delete语句。

示例示例代码:

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必须后跟一个SELECT,INSERT,UPDATE,MERGE或   DELETE语句引用一些或所有CTE列。 CTE   也可以在CREATE VIEW语句中指定   定义视图的SELECT语句。“

它说的是“单一”......陈述。我无法进行多次选择/删除/等等。如果没有,有什么方法吗?

单独两个查询都可以工作,但是您是否可以在单个存储过程中使用该CTE运行?

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:3)

CTE不能在多个语句中引用。您可以使用临时表或可变表。

您还希望将所有这些内容包含在事务中,您当然不希望执行删除操作,然后使插入失败并且不回滚删除。

答案 2 :(得分: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);