يقوم SQL 2005 بنسخ عمود واحد بين قواعد البيانات
-
09-06-2019 - |
سؤال
ما زلت جديدًا إلى حد ما على T-SQL وSQL 2005.أحتاج إلى استيراد عمود من الأعداد الصحيحة من جدول في قاعدة البيانات 1 إلى جدول مماثل (يفتقد العمود الذي أحتاجه فقط) في قاعدة البيانات 2.كلاهما قواعد بيانات SQL 2005.لقد جربت أمر الاستيراد المدمج في Server Management Studio ولكنه أجبرني على نسخ الجدول بأكمله.يؤدي هذا إلى حدوث أخطاء بسبب القيود والأعمدة "للقراءة فقط" (أيًا كان معنى "للقراءة فقط" في SQL2005).أريد فقط الحصول على عمود واحد ونسخه إلى جدول.
يجب أن تكون هناك طريقة بسيطة للقيام بذلك.شيء مثل:
INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
المحلول
لن يؤدي الإدراج إلى ذلك لأنه سيحاول إدراج صفوف جديدة في نهاية الجدول.ما يبدو أنك تحاول القيام به هو إضافة عمود إلى نهاية الصفوف الموجودة.
لست متأكدًا مما إذا كان بناء الجملة صحيحًا تمامًا، ولكن إذا فهمتك، فسيؤدي هذا إلى ما تبحث عنه.
قم بإنشاء العمود الذي يسمح بالقيم الخالية في قاعدة البيانات2.
إجراء التحديث:
تحديث database2.dbo.tablename تعيين database2.dbo.tablename.colname = database1.dbo.tablename.colname من database2.dbo.tablename inner keycol
نصائح أخرى
هناك طريقة بسيطة تشبه هذه إلى حد كبير طالما أن قاعدتي البيانات موجودتان على نفس الخادم.الاسم المؤهل بالكامل هو dbname.Owner.table - عادةً ما يكون المالك DBO وهناك اختصار لـ ".dbo." وهو ".." ، هكذا ...
INSERT INTO Datbase1..MyTable
(ColumnList)
SELECT FieldsIWant
FROM Database2..MyTable
قم أولاً بإنشاء العمود إذا لم يكن موجودًا:
ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed
وبما أنك تستخدم Sql Server 2005، يمكنك استخدام الإصدار الجديد دمج إفادة.ال دمج يتميز البيان بأنه قادر على معالجة جميع المواقف في بيان واحد مثل الصفوف المفقودة من المصدر (يمكن إجراء عمليات الإدراج)، والصفوف المفقودة من الوجهة (يمكن إجراء عمليات الحذف)، ومطابقة الصفوف (يمكن إجراء التحديثات)، وكل شيء يتم بشكل ذري في معاملة واحدة.مثال:
MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN
UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])
تم تقديم بيان MERGE لحل حالات مثل حالتك وأوصي باستخدامه، فهو أقوى بكثير من الحلول التي تستخدم عبارات دفعة SQL متعددة والتي تنجز بشكل أساسي نفس الشيء الذي يفعله MERGE في عبارة واحدة دون التعقيد الإضافي.
يمكنك أيضًا استخدام المؤشر.بافتراض أنك تريد تكرار جميع السجلات الموجودة في الجدول الأول وملء الجدول الثاني بصفوف جديدة، فسيكون الأمر كالتالي:
DECLARE @FirstField nvarchar(100)
DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable
OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )
FETCH NEXT FROM ACursor INTO @FirstField
END
CLOSE ACursor
DEALLOCATE ACursor
الدمج متاح فقط في SQL 2008 وليس SQL 2005
أدخل في Test2.dbo.MyTable (MyValue) وحدد MyValue من Test1.dbo.MyTable
وهذا يفترض قدرا كبيرا.أولاً أن قاعدة البيانات الوجهة فارغة.ثانيا أن الأعمدة الأخرى لاغية.قد تحتاج إلى تحديث بدلاً من ذلك.للقيام بذلك سوف تحتاج إلى أن يكون لديك مفتاح مشترك.