2009-03-31 15 views
17

SQL सर्वर 2005 में किसी तालिका से पहचान को निकालने का कोई आसान तरीका है?एसक्यूएल सर्वर कॉलम से पहचान कैसे छोड़ें

जब मैं प्रबंधन स्टूडियो का उपयोग करता हूं, तो यह एक स्क्रिप्ट उत्पन्न करता है जो पहचान के बिना दर्पण तालिका बनाता है, डेटा कॉपी करता है, तालिका छोड़ देता है, फिर दर्पण तालिका का नाम बदलता है। इस स्क्रिप्ट में 5231 लाइनें हैं क्योंकि यह तालिका/कॉलम में कई एफके संबंध हैं।

मैं एक साधारण परिवर्तन/ड्रॉप चलाने में अधिक आरामदायक महसूस करता हूं। कोई विचार?

संपादित
मुझे लगता है कि मैं सिर्फ एंटरप्राइज़ प्रबंधक से 5231 लाइन स्क्रिप्ट के साथ जाने के लिए जा रहा हूँ। हालांकि, मैं इसे छोटे हिस्सों में तोड़ने जा रहा हूं जिसे मैं चला सकता हूं और बेहतर नियंत्रण कर सकता हूं।

delete MyTable where MyPrimaryKey=1234 

Msg 8621, Level 17, State 2, Line 1 
    The query processor ran out of stack space during query optimization. Please simplify the query. 

कोई संदेह नहीं है, सभी FKS: यह तालिका "बर्ताव करता है" अजीब है, अगर आप 1 पंक्ति (यहां तक ​​कि जिसमें हाल ही में डाला है, जो किसी भी अन्य FK तालिका में नहीं है) को हटाने का प्रयास, तो आप इस त्रुटि मिलती है। जब हम इन स्कीमा और संबंधित एप्लिकेशन में परिवर्तन करते हैं, तो हम अपने एप्लिकेशन तक पहुंच को रोक देंगे और एकल उपयोगकर्ता मोड में चलेंगे। हालांकि, हमें इसे तेजी से चलाने की आवश्यकता है, और मुझे यह पता होना चाहिए कि इसमें कितना समय लगेगा। मुझे लगता है कि मुझे परीक्षण, परीक्षण, परीक्षण करना होगा।

उत्तर

28

यदि आप SQL Server 2005 या बाद में हैं, तो आप इसे एक साधारण मेटाडेटा परिवर्तन के रूप में कर सकते हैं (एनबी: को मूल रूप से वर्णित विभाजन के संस्करण की आवश्यकता नहीं है)।

उदाहरण कोड पॉल व्हाइट द्वारा this Microsoft Connect Item पर कामकाज से निर्दयतापूर्वक पायलर्ड किया गया।

USE tempdb; 
GO 
-- A table with an identity column 
CREATE TABLE dbo.Source 
(row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); 
GO 
-- Some sample data 
INSERT dbo.Source (data) 
VALUES (CONVERT(SQL_VARIANT, 4)), 
     (CONVERT(SQL_VARIANT, 'X')), 
     (CONVERT(SQL_VARIANT, {d '2009-11-07'})), 
     (CONVERT(SQL_VARIANT, N'áéíóú')); 
GO 
-- Remove the identity property 
BEGIN TRY; 
    -- All or nothing 
    BEGIN TRANSACTION; 

    -- A table with the same structure as the one with the identity column, 
    -- but without the identity property 
    CREATE TABLE dbo.Destination 
    (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); 

    -- Metadata switch 
    ALTER TABLE dbo.Source SWITCH TO dbo.Destination; 

    -- Drop the old object, which now contains no data 
    DROP TABLE dbo.Source; 

    -- Rename the new object to make it look like the old one 
    EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT'; 

    -- Success 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    -- Bugger! 
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; 
    PRINT ERROR_MESSAGE(); 
END CATCH; 
GO 

-- Test the the identity property has indeed gone 
INSERT dbo.Source (row_id, data) 
VALUES (5, CONVERT(SQL_VARIANT, N'This works!')) 

SELECT row_id, 
     data 
FROM dbo.Source; 
GO 

-- Tidy up 
DROP TABLE dbo.Source; 
+1

यह एक शानदार समाधान है! –

+0

वाह! सुंदर! –

+1

उम्र के लिए इस के लिए शिकार किया गया था! +99 अगर मैं कर सकता था :) – MPritchard

5

आप उस तालिका में एक कॉलम जोड़ सकते हैं जो पहचान कॉलम नहीं है, डेटा कॉपी करें, मूल कॉलम ड्रॉप करें, और नए कॉलम को पुराने कॉलम में बदलें और इंडेक्स को फिर से बनाएं।

Here एक लिंक है जो एक उदाहरण दिखाता है। अभी भी एक साधारण बदलाव नहीं है, लेकिन यह 5231 लाइनों से निश्चित रूप से बेहतर है।

+0

यह लगभग 5231 लाइन प्रबंधन स्टूडियो स्क्रिप्ट के समान ही है, लेकिन ऐसा करने के लिए कोई वास्तविक "बदलाव तालिका" तरीका नहीं है, यह एक अच्छी शर्त की तरह दिखता है। –

7

मुझे विश्वास नहीं है कि आप सीधे कॉलम के पहचान भाग को छोड़ सकते हैं।

  • तालिका
  • उस कॉलम में पहचान मूल्यों कॉपी
  • ड्रॉप मूल पहचान स्तंभ
  • नया स्तंभ का नाम बदलने को बदलने के लिए के लिए एक और गैर पहचान कॉलम जोड़ें: आपका सबसे अच्छा शर्त शायद करने के लिए है मूल कॉलम

यदि पहचान कॉलम कुंजी या अन्य बाधा का हिस्सा है, तो आपको उन बाधाओं को छोड़ना होगा और उपरोक्त परिचालन पूर्ण होने के बाद उन्हें फिर से बनाना होगा।

संबंधित मुद्दे