mrb*_*lah 20 sql sql-server common-table-expression
我的存储过程如下:
WITH MYCTE(....)
AS
(
...
)
UPDATE ... (using my CTE)
DELETE ( using my CTE) <--- says the object, my CTE, doesn't exist
Run Code Online (Sandbox Code Playgroud)
我可以只使用一次吗?
KM.*_*KM. 21
在您的示例代码中,CTE仅持续UPDATE.如果你需要它持续更长时间,可以考虑用它填充#tempTable或@tableVariable,然后从那些中填充UPDATE和DELETE.
您还可以扩充UPDATE以使用OUTPUT子句,如下所示,以便捕获受影响的行.并在DELETE中使用它们,如下所示:
set nocount on
DECLARE @Table table (PK int, col1 varchar(5))
DECLARE @SavedPks table (PK int)
INSERT INTO @Table VALUES (1,'g')
INSERT INTO @Table VALUES (2,'g')
INSERT INTO @Table VALUES (3,'g')
INSERT INTO @Table VALUES (4,'g')
INSERT INTO @Table VALUES (5,'x')
INSERT INTO @Table VALUES (6,'x')
set nocount off
;WITH MYCTE
AS
(
SELECT PK, col1 FROM @Table
)
UPDATE MYCTE
SET col1='xyz'
OUTPUT INSERTED.PK
INTO @SavedPks
WHERE col1='g'
SELECT 'A',* FROM @Table
DELETE @Table
WHERE PK IN (SELECT PK from @SavedPks)
SELECT 'B',* FROM @Table
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
(4 row(s) affected)
PK col1
---- ----------- -----
A 1 xyz
A 2 xyz
A 3 xyz
A 4 xyz
A 5 x
A 6 x
(6 row(s) affected)
(4 row(s) affected)
PK col1
---- ----------- -----
B 5 x
B 6 x
(2 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13003 次 |
| 最近记录: |