17

同じ列定義を持つ 2 つのテーブルがあります。あるテーブルから別のテーブルに行を移動する (コピーしない) 必要があります。(トランザクションで) INSERT INTO/DELETE を使用する前に、よりスマートな方法はありますか?

SQL Server 2005

4

5 に答える 5

32

SQL Server 2005 以降の場合は、OUTPUT 句 (Transact-SQL)句を試してください。

DELETE OldTable
  OUTPUT DELETED.col1, DELETED.col2...
      INTO NewTable
  WHERE ID=...

作業例:

DECLARE @OldTable table(col1 int, col2    varchar(5), col3 char(5), col4     datetime)
DECLARE @NewTable table(col1 int, column2 varchar(5), col3 int    , col_date char(23), extravalue int, othervalue varchar(5))
INSERT @OldTable VALUES (1 , 'AAA' ,'A'  ,'1/1/2010'           )
INSERT @OldTable VALUES (2 , 'BBB' ,'12' ,'2010-02-02 10:11:22')
INSERT @OldTable VALUES (3 , 'CCC' ,null ,null                 )
INSERT @OldTable VALUES (4 , 'B'   ,'bb' ,'2010-03-02'         )

DELETE @OldTable
    OUTPUT DELETED.col1
          ,DELETED.col2
          ,CASE
               WHEN ISNUMERIC(DELETED.col3)=1 THEN DELETED.col3 
               ELSE NULL END
          ,DELETED.col4
          ,CONVERT(varchar(5),DELETED.col1)+'!!'
        INTO @NewTable (col1, column2, col3, col_date, othervalue)
    OUTPUT 'Rows Deleted: ', DELETED.* --this line returns a result set shown in the OUTPUT below
    WHERE col1 IN (2,4)

SELECT * FROM @NewTable

出力:

               col1        col2  col3  col4
-------------- ----------- ----- ----- -----------------------
Rows Deleted:  2           BBB   12    2010-02-02 10:11:22.000
Rows Deleted:  4           B     bb    2010-03-02 00:00:00.000

(2 row(s) affected)

col1        column2 col3        col_date                extravalue  othervalue
----------- ------- ----------- ----------------------- ----------- ----------
2           BBB     12          Feb  2 2010 10:11AM     NULL        2!!
4           B       NULL        Mar  2 2010 12:00AM     NULL        4!!

(2 row(s) affected)
于 2010-05-13T19:14:35.920 に答える
3

Insert into abc (a,b,c) select(a,b,c) from def を試すことができます

上記のようにすると、def の列 a、b、c が abc の列 a、b、c に挿入されます。挿入後、テーブルの削除を実行するか、テーブルを削除するか、基準が何であれ切り捨てます。

サンプルは次のとおりです。

Begin
    Begin try

         Begin Transaction

               Insert into emp(name, department, salary)                    
                       Select empName,empDepartment,empSal from employees
                       Where  employees.empID = 211

               Truncate table employees

          End Transaction  

    End try

    Begin Catch

         if @@Error > 0
              Rollback Transaction

    End Catch

End
于 2010-05-13T19:39:32.457 に答える
0
INSERT dbo.newtable(
      name,
      department,
      Salary
) SELECT 
            name,
            FirstName,
            Lastname
      FROM    (
           DELETE dbo.oldtable
           OUTPUT
                   DELETED.name,
                   DELETED.department,
                   DELETED.Salary
           WHERE ID  IN ( 1001, 1003, 1005 )
      ) AS RowsToMove  

SELECT * FROM dbo.newtable
SELECT * FROM dbo.oldtable
于 2015-07-23T13:49:39.103 に答える
0

SQL には MOVE コマンドのようなものはありません。最初にテーブル 1 からテーブル 2 に挿入し、次にテーブル 1 からコピーを削除する必要があります。

于 2010-05-13T19:13:55.320 に答える
0

いいえ、トランザクション内にラップされた挿入と削除にかなりこだわっています

于 2010-05-13T19:13:56.763 に答える