أضف عمود جدول جديد إلى وضع ترتيبي محدد في Microsoft SQL Server
-
12-09-2019 - |
سؤال
هل من الممكن إضافة عمود إلى جدول في وضع ترتيبي محدد في 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. ربما هذا هو ما ستحتاج إليه.
قد تحتاج أيضا إلى إلغاء تحديد هذا الخيار للسماح بإنشاء البرامج النصية التغيير
الجواب هو نعم، من الناحية الفنية، ولكن سيكون لديك صداع للقيام بذلك، وسوف يستغرق الأمر وقتا طويلا لتنفيذ وإعدادها.
واحد: إنشاء / نسخ / قطرة / إعادة تسمية
هذا هو في الواقع ما يفعله 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)