2017-08-03 6 views
2

テーブルから別のテーブルに行を移動したいので、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です。だから私はそれらのことが何であるかも分かりません。

なぜ、値をハードコードして挿入できないのですか?または、私が賢くなるようにしたい場合は、4selectと置き換えてください。

答えて

7

まあ、delete_output_testは、4またはthing4という名前の列はありませんが、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 | 
+--------+-----------+--------+--------+ 
+0

私はそれがなぜ私に起こらなかったのか分かりません。ありがとう! – mac9416

+1

@ mac9416お手伝いします! – SqlZim

+0

それはクールでした。 –

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は、追加の列のためのスペースがあることを確認する必要があります。

+0

これは反対方向にデータを移動するために... delete_output_test2からdelete_output_testているようです。私は間違っていますか? – mac9416

関連する問題