هل هناك أي طريقة لإنشاء عبارات إدراج متعددة في استعلام ms-access؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أستخدم MS Access 2003.أريد تشغيل الكثير من عبارات SQL المدرجة فيما يسمى "الاستعلام" في MS Access.هل هناك أي طريقة سهلة (أو في الواقع أي طريقة) للقيام بذلك؟

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

المحلول

نعم و لا.

لا يمكنك أن تفعل:

insert into foo (c1, c2, c3)
values ("v1a", "v2a", "v3a"),
       ("v1b", "v2b", "v3b"),
       ("v1c", "v2c", "v3c")

ولكن يمكنك القيام به

insert into foo (c1, c2, c3)
    select (v1, v2, v3) from bar

ماذا سيستفيد منك هذا إذا لم تكن لديك البيانات الموجودة في الجدول بالفعل؟حسنًا، يمكنك صياغة عبارة تحديد مكونة من الكثير من اتحادات التحديدات مع نتائج مشفرة بشكل ثابت.

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

ملحوظة:يجب علي أيضًا تضمين شكل من أشكال الجدول الوهمي (على سبيل المثال، صف واحد) لخداع الوصول للسماح بالاتحاد (يجب أن يحتوي على صف واحد على الأقل)، وتحتاج إلى "أعلى 1" للتأكد من أنك لا تفعل ذلك الحصول على تكرارات لجدول يحتوي على أكثر من صف واحد

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

نصائح أخرى

أنا شخصياً أقوم بإنشاء روتين فرعي لـ VBA للقيام بذلك، والاتصال بقاعدة البيانات باستخدام أحد أشكال اتصال SQL.

في الجزء العلوي من رأسي، يجب أن يبدو رمز القيام بذلك كما يلي:

Sub InsertLots ()
    Dim SqlConn as Connection
    SqlConn.Connect("your connection string")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (1, 2)")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (2, 3)")
    SqlConn.Close()
End Sub

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

إذا كان مخزن البيانات عبارة عن قاعدة بيانات Jet، فمن غير المنطقي استخدام أي شكل من أشكال ADO إلا إذا كنت تقوم بتشغيل التعليمات البرمجية الخاصة بك من نظام أساسي للبرمجة النصية حيث يكون هذا هو الخيار المفضل.إذا كنت تستخدم برنامج Access، فهذا ليس هو الحال بالتأكيد، وDAO هي الواجهة المفضلة.

لا - الاستعلام في Access عبارة عن عبارة SQL واحدة.لا توجد طريقة لإنشاء مجموعة من البيانات المتعددة داخل كائن استعلام واحد.يمكنك إنشاء كائنات استعلام متعددة وتشغيلها من وحدة ماكرو/وحدة نمطية.

@ ريك غارنر:لست متأكدًا مما تقصده بـ "الدفعة" ولكن

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

البناء، على الرغم من كونه SQL واحد إفادة, ، سيقوم فعليًا بإدراج كل صف واحدًا تلو الآخر (بدلاً من الكل مرة واحدة) ولكن في نفس المعاملة:يمكنك اختبار ذلك عن طريق إضافة قيد ذي صلة على سبيل المثال.

ALTER TABLE foo ADD
   CONSTRAINT max_two_foo_rows
      CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));

على افتراض أن الجدول فارغ، ما ورد أعلاه INSERT INTO..SELECT.. يجب أن تعمل:الحقيقة ليست كذلك لأنه تم التحقق من القيد بعد إدراج الصف الأول بدلاً من بعد إدراج الثلاثة (انتهاك لـ ANSI SQL-92 ولكن هذا هو MS Access بالنسبة لك)؛توضح حقيقة بقاء الجدول فارغًا أنه تم التراجع عن المعاملة الداخلية.

@ديفيد دبليو.فنتون:قد يكون لديك تفضيل شخصي قوي لـ DAO، ولكن من فضلك لا تتشدد مع أي شخص لاختيار تقنية بديلة للوصول إلى البيانات (في هذه الحالة ADO)، خاصة بالنسبة للفانيليا INSERT وعندما يقومون بتأهيل تعليقاتهم بـ "في أعلى رأسي، يجب أن يبدو الكود للقيام بذلك شيئًا مثل..." بعد كل شيء، لا يمكنك استخدام DAO لإنشاء CHECK قيد :)

لا يسمح MS Access بالإدراج المتعدد من نفس نافذة SQL.أذا أردت إدراج, ، يقول 10 صفوف في الجدول, ، يقول فيلم (منتصف، اسم، مدير، ....), ، ستحتاج إلى فتح نوافذ SQL ،

  1. اكتب stmt الأول، نفذ stmt الأول، احذف stmt الأول
  2. اكتب stmt الثاني، قم بتنفيذ stmt الثاني، واحذف stmt الثاني
  3. اكتب stmt الثالث، نفذ stmt الثالث، احذف stmt الثالث ......

مملة جدا.بدلاً من ذلك، يمكنك استيراد السطور من Excel عن طريق القيام بما يلي:

  1. انقر بزر الماوس الأيمن على اسم الجدول الذي قمت بإنشائه بالفعل
  2. الاستيراد من Excel (يتم فتح مربع حوار الاستيراد)
  3. استعرض للوصول إلى ملف Excel الذي يحتوي على السجلات التي سيتم استيرادها في الجدول
  4. انقر فوق "إلحاق نسخة من السجلات بالجدول:"
  5. حدد الجدول المطلوب (في هذا الفيلم النموذجي)
  6. انقر على "موافق"
  7. حدد ورقة العمل التي تحتوي على البيانات الموجودة في جدول البيانات
  8. انقر على إنهاء

تم تحميل مجموعة البيانات بالكامل في برنامج Excel في الجدول "MOVIE"

يمكن لـ MS Access أيضًا إلحاق البيانات بجدول من ملف نصي بسيط.CSV القيم (لقد استخدمت ببساطة مربع استبدال الكل لحذف الكل ما عدا الفواصل) وضمن البيانات الخارجية حدد الملف النصي.

From this:
INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 a.m.','BUS311','105');
INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 a.m.','BUS200','105');
INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 p.m.','BUS252','342');
To this:
10012,ACCT-211,1,MWF 8:00-8:50 a.m.,BUS311,105
10013,ACCT-211,2,MWF 9:00-9:50 a.m.,BUS200,105
10014,ACCT-211,3,TTh 2:30-3:45 p.m.,BUS252,342
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top