هل هناك طريقة لاستخدام قيم الأعمدة الافتراضية بشكل مشروط في عبارة insert..solyct؟

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

سؤال

لقد حصلت على رمز مشابه لما يلي في الإجراء المخزن الذي يقوم بإدراج صف في جدول ، أود تعيين العمود الأخير (FieldD) عمود.

IF (@prmSomeValue IS NULL)
   INSERT INTO MyTable (fieldA,FieldB,FieldC)  
      SELECT A,B,C 
      FROM MyOtherTable
ELSE
   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,@prmSomeValue 
      FROM MyOtherTable

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

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
      FROM MyOtherTable

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

تحديث - لمسة أخرى
القيد الافتراضي ليس قيمة حرفية ، ولكن وظيفة كما هو موضح أدناه.

...DEFAULT (suser_sname()) FOR [FieldD]

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

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
      FROM MyOtherTable
هل كانت مفيدة؟

المحلول

نظرًا لأن هذا هو ما يفعله SQL Server بشكل أساسي ، يمكنك أن تفعل شيئًا كهذا على الأقل لتجنب بيانين متطابقين تقريبًا (الكود الزائف):

INSERT (columnA,B,C) ... ;

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;

لا أعتقد أن هناك طريقة للتجمع مع القيمة الافتراضية.

نصائح أخرى

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

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

هذه ربما العمل ، يعتمد على ما إذا كنت تعني القيمة الافتراضية المحددة في القيد الافتراضي ، أو في التعليمات البرمجية؟ إذا فشل "القيد" ، إذا كان "الكود" يعمل. تعديل: تقصد القيد. دوه!

SELECT A,B,C,@prmSomeValue
      FROM MyOtherTable
      WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
      FROM MyOtherTable
      WHERE @prmSomeValue IS NULL

ما هي الطريقة التي تريد القيام بها ، فإن تحديد عمود في شرط إدراج يتطلب قيمة.

لذا فإن الحل الأول هو ما تفعله ...

شيء من هذا القبيل قد يعمل (ليس جميلًا جدًا):

INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
SELECT A,B,C,
    case when @prmSomeValue is null 
then
        (SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
            WHERE id = object_id('MyTable') AND cdefault > 0))
    else @prmSomeValue
    end
FROM MyOtherTable
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top