जवाब है हां, यह तकनीकी रूप से संभव है, लेकिन आप एक सिरदर्द ऐसा करने होंगे और यह एक लंबे समय निष्पादित और स्थापित करने के लिए ले जाएगा।
एक: यहाँ स्क्रिप्ट यह पैदा करने और जब आप क्लिक 'सहेजें' निष्पादित हो रहा है की एक उदाहरण है:/कॉपी/ड्रॉप/नाम बदलें
यह वास्तव में क्या एसक्यूएल सर्वर ग्राफिकल इंटरफेस में कर रहा है बनाएं एक तालिका की शुरुआत में एक नया कॉलम जोड़ने के बाद बटन।
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_SomeTable
(
MyNewColumn int NOT NULL,
OriginalIntColumn int NULL,
OriginalVarcharColumn varchar(100) NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT'
GO
GO
COMMIT
दो: स्तंभ जोड़ें/अपडेट/ड्रॉप स्तंभ/नाम बदलें
इस विधि मूल रूप से किसी भी मौजूदा स्तंभ है कि आप अपने नए स्तंभ का 'सही' में जोड़ना चाहते हैं की एक प्रति बनाने शामिल है, डेटा को नए कॉलम में स्थानांतरित करना, फिर मूल को छोड़ना और नए नामकरण करना। यह आपके पास किसी भी इंडेक्स या बाधाओं के साथ कहर बरकरार रखेगा, क्योंकि आपको उन्हें दोबारा दर्ज करना होगा। यह तकनीकी रूप से संभव है, लेकिन फिर विकास और निष्पादन के मामले में दोनों समय लेने वाला है।
CREATE TABLE MyTest (a int, b int, d int, e int)
INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)
SELECT * FROM MyTest -- your current table
ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int
UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns
ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e
EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';
SELECT * FROM MyTest
DROP TABLE MyTest -- clean up the sample
तीन: यह
यह जोर से आदेश की मेरी भावना नाराज साथ रहते हैं ... लेकिन कभी कभी, यह सिर्फ लायक फेरबदल नहीं है।
या यही कारण है कि मुझे हर तालिका के शीर्ष पर विचार बनाना चाहिए? –
संबंधित: http://stackoverflow.com/q/1605144/12484 –