سؤال

حتى الآن كنت أستخدم ISNULL(dbo.fn_GetPrice(ItemId), 0) لجعلها غير قابلة للإلغاء (بدلاً من ذلك، أطلق عليها القيمة الافتراضية، ولكن أيًا كان).

هل هذا هو الطريق الصحيح؟

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

المحلول

نعم، هذا هو الطريق الصحيح لتحقيق ذلك. باستخدام وظيفة isnull كنت تقوم بإنشاء التعبير التي يجب إرجاع قيمة، لا يهم ما. ويتم تقييم ذلك عن طريق SQL Server أن عمود محسوب التي not null.

نصائح أخرى

أفضّل وظيفة COALESCE القياسية ANSI، لكن ISNULL جيدة.لاستخدام COALESCE، حدد العمود المحسوب الخاص بك على النحو التالي:

COALESCE(dbo.fn_GetPrice(ItemId), 0)

يحرر تعلم شيئا جديدا كل يوم.فعلت ما يلي:

create table t (c1 int null
    , c2 as isnull(c1, 1) 
    , c3 as isnull(c1, null)
    , c4 as coalesce(c1, 1)
    , c5 as coalesce(c1, null)
    )

exec sp_help t

وc2 ليس بالفعل خاليًا وفقًا لـ sp_help، ولكن تم الإبلاغ عن c4 باعتباره خاليًا، على الرغم من عدم وجود طريقة يمكن أن يؤدي بها تعبير الدمج إلى قيمة فارغة.

أيضًا اعتبارًا من عام 2008، لا أعرف ما إذا كان الخيار موجودًا في عام 2005 أم لا، ويمكن للمرء أن يستمر في عمود محسوب ويضيف قيدًا:

create table t (c1 int null
    , c2 as isnull(c1, 1) persisted not null
    , c3 as isnull(c1, null) persisted not null
    , c4 as coalesce(c1, 1) persisted not null
    , c5 as coalesce(c1, null) persisted not null
    )
go
insert into t (c1) values (null)

يؤدي إلى انتهاك القيد.

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