هل هناك طريقة لاستخدام قيم الأعمدة الافتراضية بشكل مشروط في عبارة insert..solyct؟
-
23-09-2019 - |
سؤال
لقد حصلت على رمز مشابه لما يلي في الإجراء المخزن الذي يقوم بإدراج صف في جدول ، أود تعيين العمود الأخير (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