2012-01-23 17 views
5

मैं जानता हूँ कि शीर्षक अजीब लग सकता है लेकिन यह मुझे क्या करना चाहते हैं:T-SQL हटाएँ सम्मिलित रिकॉर्ड्स

  1. मैं तालिका कई रिकॉर्ड के साथ।
  2. मैं इनमें से कुछ रिकॉर्ड प्राप्त करना चाहता हूं और उन्हें अन्य तालिका में डालना चाहता हूं। कुछ इस तरह:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. मुश्किल हिस्सा मैं चाहता हूँ कि इस पंक्तियों कि मैं डाला है प्रपत्र हटाए जाने के लिए मूल तालिका के रूप में अच्छी तरह से है।

वहाँ एक आसान तरीका यह करने के लिए है, क्योंकि केवल लगता है कि मैं ऐसा करने में कामयाब रहे चयनित रिकॉर्ड को बचाने के लिए एक अस्थायी तालिका का उपयोग करने के लिए और फिर दूसरी तालिका में उन्हें पंक्तियों डाल दिया और नष्ट करने के लिए है कि पहली मेज से उनके साथ मैच। यह एक समाधान है, लेकिन इतने सारे रिकॉर्ड के साथ (3 लाख से अधिक और आधे) मैं कुछ अन्य विचार रहा हूँ ...

+0

संस्करण? –

+1

OUTPUT क्लॉज का उपयोग करें ... –

उत्तर

13

2005+ उपयोग में OUTPUT खंड इस तरह:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

यह एकल लेन-देन में प्रदर्शन किया जाएगा और या तो पूरा या एक साथ वापस रोल

+0

पता नहीं है कि मैं इसे पुनर्जीवित कर सकता हूं, लेकिन क्या आपके पास स्रोत और गंतव्य तालिकाओं में पहचान कॉलम होने पर ऐसा करने का कोई तरीका है? – intA

0

आप इस तरह की कुछ बात करना चाहिए:

INSERT INTO "table1" ("column1", "column2", ...) 
SELECT "column3", "column4", ... 
FROM "table2" 
WHERE ... 

DELETE FROM "table1" 
WHERE ... 
+2

DELETE कहां है? –

2

आपउपयोग कर सकते हैं अस्थायी तालिका में कॉपी की गई पंक्तियों के आईडी को स्टोर करने के लिएखंड। फिर आप अस्थायी तालिका के आधार पर मूल तालिका से पंक्तियों को हटा सकते हैं। SQL सर्वर के

declare @Table1 table (id int, name varchar(50)) 
declare @Table2 table (id int, name varchar(50)) 

insert @Table1 (id,name) 
      select 1, 'Mitt' 
union all select 2, 'Newt' 
union all select 3, 'Rick' 
union all select 4, 'Ron' 


declare @copied table (id int) 

insert @Table2 
     (id, name) 
output inserted.id 
into @copied 
select id 
,  name 
from @Table1 
where name <> 'Mitt' 

delete @Table1 
where id in 
     (
     select id 
     from @copied 
     ) 

select * 
from @Table1 

Working example at Data Explorer.