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 也可以在 CREATE VIEW 语句中指定为视图的定义 SELECT 语句的一部分。”

它说一个“单一的”..statement。我不能做多个选择/删除/等吗?如果没有,有没有办法解决这个问题?

两个查询单独工作,但您可以在单个存储过程中使用该 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 回答
3

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

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

于 2013-10-01T19:51:48.087 回答
1

您可以使用与公用表表达式的合并,我在下面提供了一个如何实现的示例。

例子:

;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 回答