使用输出语句插入已删除的数据以及一些硬编码值



我想将行从一个表移动到另一个表,delete from [foo] output deleted.[col] into [bar] (col)看起来是一个不错的选择。

但列并不相同。因此,我想将一些硬编码值(理想情况下以编程方式确定的值(插入到目标表中。

我设置了几张桌子来演示。

create table delete_output_test (
thing1 int not null,
thing2 varchar(50),
thing3 varchar(50)
)
create table delete_output_test2 (
thing1 int not null,
thing2 varchar(50),
thing3 varchar(50),
thing4 int
)
insert into delete_output_test values (0, 'hello', 'world'),
(1, 'it''s', 'me'),
(2, 'i', 'was'),
(3, 'wondering', 'if')

现在,如果我不是太需要,从一张桌子移动到另一张桌子就可以了......

delete from delete_output_test2
output deleted.thing1,
deleted.thing2,
deleted.thing3
into delete_output_test
(thing1,
thing2,
thing3)

但是,如果我想填充最后一列怎么办?

delete from delete_output_test2
output deleted.thing1,
deleted.thing2,
deleted.thing3
into delete_output_test
(thing1,
thing2,
thing3,
4)

"4"附近的语法不正确。期待"."、ID、PSEUDOCOL 或 QUOTED_ID。

我对SQL相当陌生,所以我甚至不确定这些东西是什么。

那么,为什么我不能对要插入的值进行硬编码呢?或者,如果我想变得聪明,甚至可以用一些select语句替换4

好吧,delete_output_test没有名为4thing4的列,但delete_output_test2有。所以你可以这样做:

delete from delete_output_test
output deleted.thing1,
deleted.thing2,
deleted.thing3,
4
into delete_output_test2
(thing1,
thing2,
thing3,
thing4);
select * from delete_output_test2;

Rextester 演示:http://rextester.com/CVZOB61339

返回:

+--------+-----------+--------+--------+
| thing1 |  thing2   | thing3 | thing4 |
+--------+-----------+--------+--------+
|      0 | hello     | world  |      4 |
|      1 | it's      | me     |      4 |
|      2 | i         | was    |      4 |
|      3 | wondering | if     |      4 |
+--------+-----------+--------+--------+

这个要求有点奇怪,但我认为您可以使用 CTE 或子查询来做到这一点:

with todelete as (
select dot.*, 4 as col4
from delete_output_test
)
delete from todelete
output deleted.thing1, deleted.thing2, deleted.thing3, deleted.col4
into delete_output_test2(thing1, thing2, thing3, col4);

您需要确保delete_output_test有空间容纳其他列。

最新更新