T -SQL - هل هناك طريقة (مجانية) لمقارنة البيانات في جدولين؟

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

سؤال

أملك table a و table b. (SQL Server 2008)

كلا الجدولين لهما نفس المخطط.

لأغراض هذا السؤال ، فكر table a = طاولة ديف المحلية الخاصة بي ، table b = الجدول المباشر.

أحتاج إلى إنشاء برنامج نصي SQL (يحتوي UPDATE/DELETE/INSERT العبارات) التي ستقوم بتحديث الجدول B لتكون هي نفس الجدول أ. سيتم بعد ذلك نشر هذا البرنامج النصي في قاعدة البيانات المباشرة.

أي أدوات مجانية يمكن أن تفعل ذلك ، أو أفضل من طريقة يمكنني القيام بذلك بنفسي؟

أعتقد أنني ربما أحتاج إلى القيام بشيء من الانضمام إلى جميع الحقول في الجداول ، ثم إنشاء SQL ديناميكي بناءً على ذلك.

هل لدي احد اى افكار؟

تعديل

حسنًا ، أعتقد أنني أوضح هذا السؤال قليلاً.

الجدول الذي أحتاجه لمزامنة هو جدول بحث بسيط. البيانات بسيطة للغاية ومباشرة.

هذه فكرة عما TABLE A قد تبدو مثل:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           0

هذه فكرة عما TABLE B قد تبدو مثل:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           1

في الأساس ، كل ما أريد فعله هو تحديث ذلك BIT عمود (IsFoo) في TABLE B لمطابقة القيمة المقابلة في TABLE A لنفس IDFOO.

تذكر:

  • TABLE A موجود على الجهازي المحلي
  • TABLE B موجود على الخادم المباشر

من الواضح أن لدي نسخة احتياطية (موثوقة) TABLE B على الجهاز المحلي الذي أحتاجه إلى البرنامج النصي ، ثم قم بتشغيل البرنامج النصي على الخادم المباشر.

يحتوي الجدول أيضًا على سلامة مرجعية (أعمدة أخرى لم أعرضها). مما يعني أنه لا يمكنني فقط حذف كل شيء TABLE B والقيام بإدراج من TABLE A.

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

تعديل:

حسنًا - لذلك ذهبت مع إجابة Oleg (مقارنة بيانات VS2010). سريع وسهل ويعمل سحر.

لا يعني أن الإجابات الأخرى غير صحيحة. أنا أقدر كل الإجابات!

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

المحلول

في الحالات البسيطة جدًا ، ستتمكن من تحديد خادم SQL المحلي في خادم SQL المحلي خادمًا جديدًا مرتبطًا (انظر في استوديو Microsoft SQL Server Management ضمن "كائنات الخادم" / "خادم مرتبط") واستخدام INNER JOIN و OUTER JOIN لمعرفة الاختلافات بين الجداول A و B.

في موقف حقيقي وأكثر تعقيدًا ، يجب أن تأخذ في الاعتبار النزاهة المرجعية ، والمفاتيح الخارجية المختلفة ، وحقول الهوية (التزايدية التلقائية) الموجودة في قاعدة بيانات الوجهة ، وبالتالي سيكون البرنامج النصي التحديث أكثر تعقيدًا. لذلك سأوصي بأن لا تقضي وقتك في إنشاء مزامنة المطور والإنتاج DB واستخدام أداة قياسية بدلاً من ذلك. أستخدم على سبيل المثال ميزات Visual Studio Team Edition 2008 (أو إصدار قاعدة البيانات) أو Visual Studio 2010 Ultimate Edition لمقارنة البيانات في قواعد بيانات. أنه يعمل بشكل جيد جدا.

نصائح أخرى

إجابة متأخرة ولكن يمكن أن تكون مفيدة لزوار الخيط

إلى جانب الحلول الأخرى المذكورة ، يمكنني أن أقترح تجربة Diff بيانات APEXSQL. يمكنه مقارنة ومزامنة بيانات قاعدة بيانات SQL Server (في قواعد البيانات المباشرة وكذلك النسخ الاحتياطية) ، وأتمتة وجدولة ترحيل البيانات. إنه يعمل مع قواعد بيانات ضخمة أيضًا ، وهو قادر على إجراء مقارنات مباشرة من SSMS.

يمكنك تنزيل هذه الأداة مجانًا واللعب معها. إنه يتميز بتجربة مجانية تعمل بكامل طاقتها ، ويقدم إصدارًا مجتمعيًا (بعد انتهاء الفترة التجريبية) تعمل على قاعدة بيانات SQL Express و Azure SQL.

لمعرفة المزيد حول الأداة ، يمكنك زيارة http://www.apexsql.com/sql_tools_datadiff.aspx

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

MSDN - دمج (Transact -SQL)

يحتوي Microsoft SSDT (المجاني) أيضًا على مقارنة البيانات والمزامنة على الرغم من أنها محدودة أكثر من الأدوات المدفوعة مثل مقارنة بيانات Redgate.

هنالك بيانات SQL مقارنة من Redgate (وإن لم يكن مجانيًا) وهناك أيضًا SMO و ال بنيت في الوظيفة.

أخيراً ويكيبيديا لديه قائمة شاملة من البرامج.

نظرًا لأنه واحد ، يمكنك استخدام هذا الاستعلام للعثور على صفوف مختلفة في هذين الجدولين:

(SELECT * FROM TABLE_A
 MINUS
 SELECT * FROM TABLE_B)

 UNION ALL

(SELECT * FROM TABLE_B
 MINUS
 SELECT * FROM TABLE_A)

MINUS سوف تقارن حقل السجلات حسب الحقل ، ثم سوف يتجاهل السجلات من الجدول الأول الذي يوجد سجل متطابق في الجدول الثاني. هذا يعمل مثل هذا:

  • أولاً MINUS يحصل على جميع السجلات من TABLE_A التي ليست في TABLE_B
  • ثانية MINUS يحصل على جميع السجلات من TABLE_B التي ليست في TABLE_A
  • يحصل الاتحاد على جميع السجلات من كلا الجدولين التي لا يوجد سجل مطابق في جدول آخر.

يمكنك الآن إدراج هذه السجلات في جدول Temp ثم إجراء إدراج/تحديثات.

اعتمادًا على احتياجاتك ، يمكنك تقييد قائمة الحقول للمقارنة.

لاحظ أنك تحتاج إلى مفتاح أساسي لهذا العمل.

تعديل:
Ooops. خادم SQL لا يدعمه MINUS المشغل أو العامل. أنا أعمل مع Oracle في العام الماضي ونصف ، لذلك كان هذا تلقائيًا.

يمكنك استخدام EXCEPT المشغل بدلا من ذلك. انظر هذا المقال: باستثناء وتبادل (Transact-SQL)

تحرير 2:

إعادة شيراند تعليق:
إذا لم يتمكن حقًا من الاتصال من الجهاز المحلي إلى الخادم المباشر ، فإنه ببساطة يمكنه التفريغ TABLE_A وتحميله على الخادم. بطريقة أو بأخرى ، الهدف هو تغيير بيانات الجدول على الخادم المباشر.

ركضت في نفس المشكلة التي قمت بها - بحثت عن أداة مجانية تقارن البيانات من جدولين MS SQL - ولم أجد شيئًا. ثم قمت بإنشاء أداة سطر أوامر مجانية بسيطة. يقارن البيانات من جدولين ، ويخلق INSERT/DELETE/UPDATE statemenets لجعل بيانات جدول الوجهة نفس المصدر. الآن أنا أستخدمها لمقارنة البيانات ، وبما أنها مجانية تمامًا ، يمكن أن أوصي بالتحقق من ذلك على: SourceForge.net - Ultradbc

يمكنك استخدام مولد البرنامج النصي للبيانات يقوم بإنشاء برنامج نصي لإدراجه ، ثم استخدام أدوات مقارنة الملفات مثل Winmerge لمقارنة الملفات للعثور على الاختلافات. هناك مقال حول إنشاء البرامج النصية للبيانات على مشروع التعليمات البرمجية: http://www.codeproject.com/kb/database/sqlinsertupdategenerator.aspx

ستعمل Tablediff - إنه مجاني ويأتي مع SQL Serverhttp://msdn.microsoft.com/en-us/library/ms162843.aspx

يمكنك أيضًا محاولة استخدام import and export data المقدمة من SQL Server 2008. إنه طريق مستقيم إلى حد ما لنسخ جميع البيانات من أي مكان إلى أي مكان. أفعل نفس الشيء وأعمل بشكل مثالي.

قد تجربنا مخطط مقارنة خادم SQL

هذه الأداة ليست مجانية (إنها تجريبية) ، ولكن يمكنك استخدام تجربة لمدة 30 يومًا مجانًا وأيضًا ، لديك فرصة للحصول على ترخيص مجاني لهذا المنتج - يرجى الرجوع إلى لدينا صفحة شروط الترخيص المجانية.

ماذا يحدث إذا كنت:

  1. نسخ devtablea على prod ،
  2. تعليق التبعيات على prodtableb
  3. إعادة تسمية Prodtable B إلى prodtableb1 ،
  4. إعادة تسمية DevTablea إلى prodtableb
  5. تبعيات إعادة التنفيذ على prodtableb الجديد
  6. اختبار prodtableb جديد ثم حذف prodtableb القديم المسمى

?

أو إذا كان عليك أن تكون أكثر احتراماً لـ ProdtableB الحالي وقيم عمود الهوية الخاصة بك في كل من Dev و Prod Match (حتى لو كانت القيم غير مستمرة) ...

declare @iLast int, @x int, @y int
select @iLast = (select MAX(id) from prodTableB)
set @x = 1
while @x <= @iLast
begin
  select @y = (select COUNT(*) from prodTableB where id = @x)
  if @y = 1
    begin
      update prodTableB set isFoo = (select isFoo from devTableA where id=@x
    end
  @x=@x+1
end

يمكنك أيضًا إلقاء نظرة على بيانات XSQL مقارنة. إصدار SQL Express مجاني ، وهناك أيضًا إصدار Lite الذي سيفعل الخدعة لقواعد البيانات الصغيرة.

أداة مجانية جيدة هي أيضًا مقارنة البيانات SSDT.

إخلاء المسئولية: أنا مرتبط بـ XSQL.

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