我正在处理一个存储过程,该过程涉及基于存储过程中先前查询的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运行?
答案 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);