同じ列定義を持つ 2 つのテーブルがあります。あるテーブルから別のテーブルに行を移動する (コピーしない) 必要があります。(トランザクションで) INSERT INTO/DELETE を使用する前に、よりスマートな方法はありますか?
SQL Server 2005
同じ列定義を持つ 2 つのテーブルがあります。あるテーブルから別のテーブルに行を移動する (コピーしない) 必要があります。(トランザクションで) INSERT INTO/DELETE を使用する前に、よりスマートな方法はありますか?
SQL Server 2005
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)
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
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
SQL には MOVE コマンドのようなものはありません。最初にテーブル 1 からテーブル 2 に挿入し、次にテーブル 1 からコピーを削除する必要があります。
いいえ、トランザクション内にラップされた挿入と削除にかなりこだわっています