سؤال

في جزء من بلادي إجراءات تخزين البيانات المخزنة، ولدي الإجراء الذي يقارن بيانات المشروع القديمة لبيانات المشروع الجديدة (البيانات القديمة في جدول جديد في جدول مؤقت) وتحديث البيانات القديمة.

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

واحدة من عبارات التحديث متعددة:

update cube.Projects
set prServiceLine=a.ServiceLine
from @projects1 a
    inner join cube.Projects
        on a.WPROJ_ID=cube.Projects.pk_prID
where prServiceLine<>a.ServiceLine
هل كانت مفيدة؟

المحلول

where prServiceLine<>a.ServiceLine

وإذا prServiceLine لاغيا أو a.ServiceLine فارغ ثم نتيجة لحالة باطل ليس منطقي

واختبار هذا:

declare @x int, @y int
if @x<>@y print 'works'
if @x=@y print 'works!'
set @x=1
if @x<>@y print 'not yet'
if @x=@y print 'not yet!'
set @y=2
if @x<>@y print 'maybe'
if @x=@y print 'maybe!'

والإخراج:

maybe

وأنت لن ترى 'أعمال'، 'يعمل!'، 'لم'، أو 'لا بعد! " الحصول على إخراج. فقط ربما ( 'ربما! "، لو كانوا على حد سواء على قدم المساواة).

ولا يمكنك اختبار القيم الخالية مع! = = أو <>، تحتاج إلى استخدام ISNULL ()، تلتحم، IS NOT NULL أو IS NULL في الخاص بك حيث إن إحدى القيم تختبره يمكن أن يكون NULL.

نصائح أخرى

وومقالة ويكيبيديا عن SQL بالقيم الخالية هو في الواقع جيدة حقا - وهذا ما يفسر كيف السلوك هو في كثير من الأحيان لا ما كنت أتوقع، والعودة "غير معروف" بدلا من صحيحة أو خاطئة في كثير من الحالات.

وهناك عدد غير قليل من gotchas المعنية إذا كنت أعرض بلا قيم ...

وربما كنت في حاجة الى LEFT JOIN (أو RIGHT اعتمادا على البيانات) بدلا من INNER JOIN.

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