سؤال

لدي أربعة جداول: الرسائل ، MessageCategory ، Messagestatus و Messagelevel.

MessageCategory و Messagestatus و Messagelevel كلها فقط ثلاثة حقول: الهوية (المفتاح الأساسي) ، الكود والوصف. تشير الرسائل إلى هذه الحقول الثلاثة ولديها بعض حقول البيانات الأخرى ، بما في ذلك الهوية (المفتاح الأساسي) Messagetext و Order. حقول الهوية هي الحقول المليئة بالسيارات.

أحتاج الآن إلى كتابة برنامج نصي SQL لإضافة بعض البيانات الافتراضية إلى جميع الجداول الأربعة. المشكلة هي أنني بحاجة إلى إنشاء برنامج نصي سيتم إرساله إلى عميل سيقوم بعد ذلك بتنفيذ هذا البرنامج النصي. لا يمكنني كتابة رمز أكثر ذكاءً للقيام بالتحديث بأكمله. وعلى الرغم من أن ثلاثة جداول هي مجرد عبارات إدراج بسيطة ، فإن جدول الرسائل هو الذي يسبب لي بعض الصداع الإضافي.

لا يمكنني إزالة أي مؤشرات ولا يمكنني افتراض أنها تبدأ في العد عند 1 للمفاتيح الأساسية.

لذلك ، على سبيل المثال ، بعض بياناتها:

INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');

وستحتاج الرسائل إلى شيء مثل هذا:

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
  (SELECT Identity from MessageCategory where Code='Cat01'), 
  (SELECT Identity from MessageStatus where Code='Status01'), 
  (SELECT Identity from MessageLevel where Code='Level01'), 
  'Just some message', 
  1
);

هذا لن يعمل ، رغم ذلك. إذن ، ما هي الحيلة للحصول على هذا العمل؟ (الحفاظ على الكود قابلاً للقراءة أيضًا ...)

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

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

المحلول

INSERT INTO Messages 
  (Category, Status, Level, MessageText, [Order]) 
SELECT
  (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01')  AS Category,
  (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
  (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01')   AS Level,
  (SELECT 'Just some message')   AS MessageText, 
  (SELECT 1)                     AS [Order]

ما سبق سيعمل لخادم SQL. لاحظ أن كلاهما Identity و Order محجوزة T-SQL الكلمات الرئيسية ويجب عدم استخدامها لأسماء الأعمدة. لاحظ أيضًا أنه يجب ألا تعيد السحر الفرعي أكثر من صف واحد حتى يعمل هذا ، لضمان تضمين TOP 1 صياغات.

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

نصائح أخرى

إذا كان نصًا واحدًا ، فقم بتخزين هوياتك في المتغيرات:

declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
        @MessageCAtegoryID,
        @MessageStatusID,
        @MessageLevelID,
        'Just some message',
        1);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top