2010-05-13 18 views

cevap

32

içine sarılmış silme gelen kopyayı kaldırmak ve yukarı, OUTPUT Clause (Transact-SQL) maddesini denemek:

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

Çalışma örneği:

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 

OUT PUT:

   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) 
+1

@ KM: +1. Bunun farkında değildim. Bu yöntemi 'INSERT' ve 'DELETE' üzerinden önerir misiniz? –

+1

Bunu her seferinde bir INSERT ve bir DELETE üzerinden kullanacağım, SQL Server muhtemelen daha iyi bir şekilde optimize edebilir ve INSERT ve SİLİNDİR, sadece aynı satırları, daha fazla ve daha azını garanti eder. –

+0

Bu bir ifadedir, yani ... işlem gerekli değil, sanırım? – lance

0

SQL bir TAŞI komutu diye bir şey yoktur. Tablonun 2'ye tablo 1'de birinci ekleme gerekecek Sonra masanın 1.

+5

OP SQL Server 2005, yani [ÇIKTI Madde (Transact-SQL)] (kullanarak http://msdn.microsoft.com/en-us/library /ms177564.aspx) tek bir komutta bunu yapabilir, cevabımı gör ... –

0

Hayır, hemen hemen insert ile sıkışmış ve SQL Server 2005 için bir işlem

+4

OP, SQL Server 2005 kullanıyor, bu yüzden [OUTPUT (Transact-SQL)] (http://msdn.microsoft.com/en) -us/library/ms177564.aspx) tek bir komutta yapabilir, cevabımı gör ... –

3

Sen abc içine yerleştirin deneyebilirsiniz (a, b, c) seçme (a, b, c) def

def c, kolon a, b ekleyecektir bu nedenle yukarıdaki yapmaktan abc'nin a, b, c sütununa ekledikten sonra bir silme tablosu çalıştırın, tabloyu bırakın veya kriterleriniz ne olursa olsun kırpın.

örnek:

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 
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 
İlgili konular