سؤال

افترض تعريف جدول في SQL Server كما يلي:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NULL,
  Info VARCHAR(MAX)
)

واستعلام:

DECLARE @id UNIQUEIDENTIFIER
DECLARE @info VARCHAR(MAX)
IF @id IS NOT NULL
BEGIN
  SELECT @info = Info
    FROM MyTable
    WHERE Id = @id
END

في هذه الحالة، ينتج محلل رمز ثابت Visual Studio الخطأ التالي:

تحذير: SR0007: Microsoft.Performance: يمكن تقييم الأعمدة غير القابلة للظلم تقييم النتائج النهائية باعتبارها NULL للمسند.

أنا لا أرى المشكلة هنا. الخطأ يرتبط بالأداء؛ يقول MSDN أنني يجب أن أستخدم ISNULL () - ولكن مقارنة متساوين ضد NULL هي دائما خاطئة، أليس كذلك؟ هل أفتقد شيئا ما، أم تحذير خطأ؟

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

المحلول

أعتقد أنه يشير إلى جملة حيث. من القول أن كل من المعلمة وعمودك يمكن أن تكون فارغة، وفي هذه الحالة لم تعد جملة أينما لم تعد تقيم إلى True / False. من خلال Funneling عمودك المطلقة في أحدهما يحتوي دائما على قيمة محددة (عبر ISNULL)، فأنت في حالة أفضل، منطق منطق.

إليك وثائق Microsoft في هذا الخطأ.

على جانبا، يفترض أن nulls من المفترض أن تجعل الاستفسارات أبطأ Skosh.

نصائح أخرى

أعتقد أن المحلل قد لا يأخذ في الاعتبار ببيان الخاص بك.

يبدو رمزك صحيح بالنسبة لي.

أعتقد أنه تحذير حاد - هل يمكنك قمعها على أساس كل حالة على حدة، أو هذا التحذير بشكل خاص تماما؟

ماذا يحدث عند القيام بذلك؟:

CREATE TABLE MyTable (
  Id   UNIQUEIDENTIFIER NOT NULL,
  Info VARCHAR(MAX)
)

مقارنة لاغية تعتمد على الإعداد.

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

هذا هو من هنا.

IF @id IS NOT NULL

يجب استبداله

IF ISNull(@id, -1) <> -1

@ RAJ: "إذا ISNULL (@، -1) <> -1"

لن أفعل ذلك لأنه يحل محل إدخال الجدول

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