سؤال

أحاول إنشاء طريقة عرض حيث أريد أن يكون عمود صحيحًا أو خطأ. ومع ذلك ، يبدو أنه بغض النظر عن ما أقوم به ، يعتقد SQL Server (2008) أن عمود البت الخاص بي يمكن أن يكون فارغًا بطريقة ما.

لدي جدول يسمى "منتج" مع "حالة" العمود الذي هو INT, NULL. في طريقة العرض ، أريد إرجاع صف لكل صف في المنتج ، مع تعيين عمود بت على صحيح إذا كان عمود المنتج.

مثال SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

إذا قمت بحفظ هذا الاستعلام كعرض وألقي نظرة على الأعمدة في مستكشف الكائنات ، فسيتم ضبط العمود على BIT, NULL. ولكن لا ينبغي أن يكون لاغية. هل هناك بعض خدعة SQL السحرية التي يمكنني استخدامها لإجبار هذا العمود على أن يكون NOT NULL.

لاحظ ذلك ، إذا قمت بإزالة CAST() حول ال CASE, ، تم تعيين العمود بشكل صحيح على أنه NOT NULL, ، ولكن بعد ذلك يتم تعيين نوع العمود على INT, وهذا ليس ما أريد. أريد أن يكون BIT. :-)

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

المحلول

يمكنك تحقيق ما تريده من خلال إعادة ترتيب استعلامك قليلاً. الحيلة هي أن ISNULL يجب أن يكون في الخارج قبل أن يفهم SQL Server أن القيمة الناتجة لا يمكن أن تكون أبدًا NULL.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

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

نصائح أخرى

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

كان لدينا جدولين باستخدام نفس القيمة مثل مفتاح الفهرس ولكن مع أنواع الدقة العددية المختلفة (سيئة ، أعرف) وكان وجهة نظرنا ينضمون إليها لإنتاج النتيجة النهائية. لكن رمز الوسيطة الخاص بنا كان يبحث عن نوع بيانات محدد ، وتم إرجاع طريقة العرض () حول العمود حول العمود

لقد لاحظت ، كما فعل المرجع ، أن واصفات الأعمدة الخاصة بنتيجة العرض حددتها على أنها قابلة للبطولة وكنت أفكر أنها مفتاح أساسي/خارجي على جدولين ؛ لماذا نريد أن تكون النتيجة محددة على أنها لاغية؟

لقد وجدت هذا المنشور ، وألقيت isnull () حول العمود وفويلا - لم يعد قابلاً للبطولة.

كانت المشكلة هي أداء العرض في المرحاض مباشرة عندما تم ترشيح استعلام على هذا العمود.

لسبب ما ، لم يكن هناك تحويل صريح () على عمود نتائج العرض المُحسّن (كان سيتعين عليه القيام بذلك على أي حال بسبب الدقة المختلفة) ولكن إضافة غلاف isnull () زائد () في حالة كبيرة. طريق.

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

  1. تأكد أولاً من عدم وجود خام في حقل البت في الجدول
  2. ثم قم بتنفيذ عبارة DDL التالية: Alter Table dbo.Product Alter column status bit not null

إذا كان ، كل ما تحاول القيام به هو التحكم في إخراج العرض ، فإن ما تفعله يكفي. سوف يضمن بناء الجملة الخاص بك أن إخراج عمود Hasstatus في Views ResultSet سوف في الواقع مطلقا كن فارغا. سوف دائماً تكون إما قيمة بت = 1 أو قيمة بت = 0. لا تقلق ما يقوله مستكشف الكائن ...

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