يقوم SQL 2005 بنسخ عمود واحد بين قواعد البيانات

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

  •  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
هل كانت مفيدة؟

المحلول

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

لست متأكدًا مما إذا كان بناء الجملة صحيحًا تمامًا، ولكن إذا فهمتك، فسيؤدي هذا إلى ما تبحث عنه.

  1. قم بإنشاء العمود الذي يسمح بالقيم الخالية في قاعدة البيانات2.

  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

وهذا يفترض قدرا كبيرا.أولاً أن قاعدة البيانات الوجهة فارغة.ثانيا أن الأعمدة الأخرى لاغية.قد تحتاج إلى تحديث بدلاً من ذلك.للقيام بذلك سوف تحتاج إلى أن يكون لديك مفتاح مشترك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top