ماذا يعني "يمكن استخدام الوظائف غير الحتمية المعرفة من قبل المستخدم بطريقة حتمية"؟

StackOverflow https://stackoverflow.com/questions/709601

سؤال

وفقًا لصفحة MSDN SQL BOL (الكتب عبر الإنترنت). وظائف حتمية وغير حتمية, ، يمكن استخدام الدوال غير الحتمية "بطريقة حتمية"

الوظائف التالية ليست حتمية دائمًا، ولكن يمكن استخدامها في طرق العرض أو الفهارس المفهرسة على الأعمدة المحسوبة عندما يتم تحديدها بطريقة حتمية.

ماذا يعني ذلك من خلال وظائف غير حتمية يمكن استخدامها بطريقة حتمية?
يمكن للشخص أن يوضح كيف يمكن القيام بذلك؟و أين هل ستفعل ذلك؟

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

المحلول

ينص BOL في الواقع على ما يلي:

الوظائف التالية هي ليس دائما حتمية, ، ولكن يمكن استخدامها في طرق العرض المفهرسة أو الفهارس على الأعمدة المحسوبة عند تحديدها بطريقة حتمية.

ثم يوضح أدناه الشروط التي يجب استيفاؤها لجعلها حتمية.

على سبيل المثال

يلقي - حتمي ما لم يتم استخدامه مع DateTime أو SmallDateTime أو SQL_Variant

وبعبارة أخرى، يجب عليك استيفاء هذه الشروط لاستخدامها فيها بطريقة حتمية

على سبيل المثال عند إنشاء جدول

CREATE TABLE [dbo].[deterministicTest](
    [intDate] [int] NULL,
    [dateDateTime] [datetime] NULL,
    [castIntToDateTime]  AS (CONVERT([datetime],[intDate],0)),
    [castDateTimeToInt]  AS (CONVERT([int],[dateDateTime],0)),
    [castIntToVarchar]  AS (CONVERT([varchar],[intDate],0))
) ON [PRIMARY]

يمكنك تطبيق الفهرس على castIntToVarchar ولكن إذا حاولت إضافة فهرس إلى castDateTimeToInt أو castIntToDateTime فسوف تحصل على الخطأ التالي:

لا يمكن استخدام العمود 'castDateTimeToInt' (castIntToDateTime) في الجدول 'dbo.deterministicTest' في فهرس أو إحصائيات أو كمفتاح قسم لأنه غير حتمي.

لذلك لا يمكن استخدام dateTime كمصدر ولا كتنسيق مستهدف لوظيفة CONVERT إذا كنت تريد أن تظل حتمية

نصائح أخرى

كون الدالة حتمية يعني أنها مضمونة دائمًا لإرجاع نفس قيمة الإخراج لنفس وسائط الإدخال.

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

ما يعنيه هذا في الممارسة العملية يعتمد على ما تفعله الوظيفة وبأي طريقة تكون غير حتمية.

مثال:

RAND(1)  // deterministic, always returns the same number

عكس:

RAND()   // non-deterministic, returns new random number on each call

لاحظ أن هذا يستخدم تعريف مقالة MSDN للكلمة "حتمية"

يجب أن تكون تعريفات BOL كما يلي:

”ترجع الدوال الحتمية دائمًا نفس النتيجة في نفس الصف في أي وقت يتم استدعاؤها باستخدام مجموعة محددة من قيم الإدخال (الصف) وإعطائها نفس حالة قاعدة البيانات.

بمعنى آخر، تقوم الدوال الحتمية دائمًا بإرجاع نفس النتيجة على أي قيمة ثابتة معينة من مجالها (في هذه الحالة يكون المجال عبارة عن صف).

قد ترجع الوظائف غير الحتمية نتائج مختلفة في كل مرة يتم استدعاؤها باستخدام مجموعة محددة من قيم الإدخال (الصف) حتى لو ظلت حالة قاعدة البيانات التي تصل إليها كما هي.

في هذه الحالة وظائف غير حتمية

أ) إرجاع قيم مختلفة في كل مرة يتصلون بها.

ب) تعتمد على القيم الموجودة خارج الصف الذي تم تطبيقه عليه.

أمثلة على المجموعة أ):NEWID()، GETDATE()، GETUTDATE()، RAND() بدون تحديد بذرة.

أمثلة على المجموعة ب):GET_TRANSMISSION_STATUS() وLAG() وRANK() وDENSE_RANK() وROW_NUMBER() وNTILE() وSUM() عند تحديدها باستخدام جملتي OVER وORDER BY."

يرجى ملاحظة ذلك يستخدم بعض المؤلفين تعريفات مختلفة للوظائف الحتمية مما قد يؤدي إلى الارتباك.

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