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

时间:2017-08-03 15:00:34

标签: sql sql-server tsql

我想将行从一个表移到另一个表,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很新,所以我甚至不确定这些是什么。

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

2 个答案:

答案 0 :(得分:7)

好吧,delete_output_test没有名为4thing4delete_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 |
+--------+-----------+--------+--------+

答案 1 :(得分:1)

这个要求有点好奇,但我认为你可以使用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有额外列的空间。