أضف عمود جدول جديد إلى وضع ترتيبي محدد في Microsoft SQL Server

StackOverflow https://stackoverflow.com/questions/769828

سؤال

هل من الممكن إضافة عمود إلى جدول في وضع ترتيبي محدد في Microsoft SQL Server؟

على سبيل المثال، تم إنشاء جداولنا دائما، Createdby، LastMoDioteon، الأعمدة LastMODIDBY في "النهاية" لكل تعريف جدول؟ أريد أن يظهر العمود الجديد في SSMS فوق هذه الأعمدة.

إذا قمت بتشكيل جميع تغييرات قاعدة البيانات الخاصة بي، هل هناك طريقة للحفاظ على هذا الطلب في نهاية الجدول؟

لمعلوماتك، أنا لا أحاول إنشاء حرب اللهب إذا كان ينبغي القيام بذلك. إذا كنت ترغب في القراءة حول مؤشر ترابط ينفج بسرعة في ذلك، فإليك واحدة جيدة:

http://www.developersdex.com/sql/message.asp؟p=581&r=5014513.

هل كانت مفيدة؟

المحلول

يجب عليك إنشاء جدول مؤقت يعكس مخطط الجدول الأصلي ولكن مع ترتيب الأعمدة الذي تريده، ثم انسخ محتويات الأصل إلى TEMP. حذف الأصل وإعادة تسمية TEMP.

هذا ما يفعله ستوديو إدارة SQL وراء الكواليس.

باستخدام أداة مزامنة المخطط، يمكنك إنشاء هذه النصوص تلقائيا.

نصائح أخرى

انتقل إلى SQL Server Management Studio، و "تصميم" جدول موجود. أدخل عمود في الأوسط، انقر بزر الماوس الأيمن في منطقة فارغة وحدد إنشاء تغيير البرنامج النصي ...

انظر الآن إلى البرنامج النصي الذي ينشئه. سوف ينشئ أساسا جدول مؤقت مع ترتيب العمود المناسب، وإدراج البيانات من الجدول الأصلي، وإفلات الجدول الأصلي، وإعادة تسمية جدول TEMP. ربما هذا هو ما ستحتاج إليه.

enter image description here

قد تحتاج أيضا إلى إلغاء تحديد هذا الخيار للسماح بإنشاء البرامج النصية التغيير

enter image description here

الجواب هو نعم، من الناحية الفنية، ولكن سيكون لديك صداع للقيام بذلك، وسوف يستغرق الأمر وقتا طويلا لتنفيذ وإعدادها.

واحد: إنشاء / نسخ / قطرة / إعادة تسمية

هذا هو في الواقع ما يفعله SQL Server في الواجهة الرسومية: إليك مثال على البرنامج النصي هو توليد وتنفيذ عند النقر فوق الزر "حفظ" بعد إضافة عمود جديد إلى بداية جدول.

/* 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

ثلاثة: عش معها

هذا يسيء بقوة إحساسي بالترتيب ... لكن في بعض الأحيان، فإنه لا يستحق إعادة التشكيل.

على حد علمي، لا توجد طريقة معروفة لتغيير ترتيب العمود. وراء الكواليس SQL Management Studio هل يفعل ما قاله خوسيه باسيليو. وإذا كان لديك جدول كبير، فمن غير العملي تغيير أوامر الأعمدة مثل هذه الطريقة.

يمكنك استخدام "عرض". مع وجهات النظر SQL يمكنك استخدام أي ترتيب تريد دون أن تتأثر بتغييرات عمود الجدول.

TFS 2013 سوف تفعل هذا لك تلقائيا.

أضف الأعمدة (الأعمدة) الجديدة إلى طاولتك على أي حال، ثم ارتكب تغييراتك على TFS. من هناك، يمكنك فتح ملف SQL في الجدول في Visual Studio ونقل ترتيب الأعمدة يدويا في البرنامج النصي T-SQL. ثم يمكنك تحديث قاعدة البيانات المستهدفة باستخدام مخطط مخطط VS مقارنة أداة موجودة ضمن الأدوات> SQL Server> مقارنة مخطط جديد. اختر مشروع قاعدة البيانات الخاص بك مع تغييرك كمصدر، وقاعدة البيانات التي تريد تحديثها كهدف. قارن، حدد البرنامج النصي الجدول، وتحديثه. سوف vs إسقاط وإضافة تلقائيا. جميع بياناتك ستكون آمنة ومهارس أيضا.

القذرة وبسيطة.
تصدير جدول إلى CSV.
أدخل بيانات جديدة في الموضع المطلوب.
انخفاض الجدول.
إنشاء جدول جديد مع مواصفات العمود المطلوب.
تحميل أعمدة من CSV إلى جدول جديد.

ما أعتقد أنه بسيط هو إضافة جدول ALTER TABLE الجدول 1 .. ثم قم بإنشاء جدول TMP مثل tmp_table1 من تحديد مثلSELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; ثم إسقاط Table1 وإعادة تسمية TMP_Table1 إلى الجدول 1، هذا هو ذلك. آمل أن يساعد شخص ما

لست متأكدا مما إذا كان الخيط لا يزال نشطا. كنت أواجه نفس الاستعلام مع قاعدة بيانات MySQL. النقر بزر الماوس الأيمن فوق الجدول وتحديد "تغيير" تلقائيا ولدت التعليمات البرمجية أدناه. عينة مقدمة من ساكيلا ديسيبل وعملت. فقط اكتشف العمود الذي تريد وضع العمود الجديد واستخدامه "بعد"

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

حدد كل العمود في جدول TEMP، وإنشاء جدول جديد مع عمود جديد تريد إسقاط الجدول القديم، وحدد كل العمود من جدول TEMP وإدراجه في عمود جديد مع إعادة ترتيب. وبدون بيانات ضائعة

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top