سؤال

(هذا هو ذات الصلة الكلمة موعد في SQL server.)

لا حتمية التعبير موجودة في الطابق التاريخ والوقت?عند استخدام هذا بمثابة عمود محسوب الصيغة:

DATEADD(dd, DATEDIFF(dd, 0, [datetime_column]), 0)

أنا على خطأ عندما وضع فهرس على عمود:

لا يمكن إنشاء مؤشر لأن مفتاح العمود 'EffectiveDate' غير محددا أو غير دقيقة.

ولكن كلا DATEDIFF و DATEADD هي حتمية وظائف عن طريق التعريف.أين هي الفائدة ؟ هل من الممكن ؟

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

المحلول

وتخميني هو أن هذا هو خلل في بعض الأنواع. في SQL 2005 وكنت قادرا على خلق مثل طريقة عرض مفهرسة دون مشكلة (رمز أدناه). عندما حاولت تشغيله على SQL 2000 على الرغم من أنني حصلت على نفس الخطأ كما كنت تحصل.

يبدو

وفيما يلي للعمل على SQL 2000، ولكن يمكنني الحصول تحذيرا من أن المؤشر سيتم تجاهل وعملتم لتحويل كل الوقت الذي قمت بتحديده من طريقة العرض.

CONVERT(CHAR(8), datetime_column, 112)

ويعمل في SQL 2005:

CREATE TABLE dbo.Test_Determinism (
    datetime_column DATETIME    NOT NULL    DEFAULT GETDATE())
GO

CREATE VIEW dbo.Test_Determinism_View
WITH SCHEMABINDING
AS
    SELECT
        DATEADD(dd, DATEDIFF(dd, 0, [datetime_column]), 0) AS EffectiveDate
    FROM
        dbo.Test_Determinism
GO

CREATE UNIQUE CLUSTERED INDEX IDX_Test_Determinism_View ON dbo.Test_Determinism_View (EffectiveDate)
GO

نصائح أخرى

لا عمود [datetime_column] تحتوي على قيمة افتراضية تعيين إلى "getDate()" ??

إذا كان الأمر كذلك ، منذ getdate() وظيفة هو غير القطعية ، وهذا سوف يسبب هذا الخطأ...

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

  1. وظيفة مخطط منضم.
  2. كل المدمج في أو معرفة من قبل المستخدم وظائف يسمى من قبل المستخدم-تعريف وظيفة القطعية.
  3. الجسم من وظيفة المراجع لا كائنات قاعدة البيانات خارج نطاق الوظيفة.على سبيل المثال ، القطعية الدالة لا الجداول المرجعية الأخرى من الجدول المتغيرات المحلية إلى وظيفة.
  4. وظيفة لا تتطلب أي الإجراءات المخزنة الموسعة.

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

وجرب هذا:

CAST(FLOOR(CAST([datetime_column] as FLOAT)) AS DateTime)

وينبغي أن يذهب أسرع بكثير من خيار CONVERT.

هنا هو بلدي أفضل إجابة الإجابة على السؤال الأصلي:

جرب هذا:

/* create a deterministic schema bound function */
CREATE FUNCTION FloorDate(@dt datetime)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN 
    RETURN CONVERT(datetime,  FLOOR(CONVERT(float, @dt)))
END
GO

لاختبار, حاول القيام بما يلي.يرجى ملاحظة أن استخدام "قائما" على عمود محسوب واستخدام [dbo.] عند الإشارة إلى وظيفة

/*create a test table */
CREATE TABLE [dbo].[TableTestFloorDate](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [TestDate] [datetime] NOT NULL,
    [TestFloorDate]  AS ([dbo].[FloorDate]([TestDate])) PERSISTED,
 CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

يجب أن تكون الآن قادرا على إضافة فهرس على عمود محسوب (ولكن انظر مسكتك في وقت لاحق)

CREATE INDEX IX_TestFloorDate ON  [dbo].[TableTestFloorDate](TestFloorDate)

إدراج بعض بيانات عشوائية عدة مرات كما يحلو لك ولكن أكثر من (1000+) هو الأفضل إذا كنت ترغب في اختبار مؤشر الاستخدام/تنفيذ الخطط

INSERT INTO TableTestFloorDate (TestDate) VALUES( convert(datetime, RAND()*50000))

الحصول على النتائج

SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'

الآن هنا هو مسكتك...الفهرس التي تم إنشاؤها على عمود محسوب لا تستخدم!بدلا من ذلك ، حتى عند اختيار البيانات على قائمة مجال TestFloorDate, SQLServer (أو على الأقل نسختي) يفضل مؤشر على TestDate.

CREATE INDEX IX_TestFloorDate ON  [dbo].[TableTestFloorDate](TestDate)

أنا متأكد (من الذاكرة) أن المؤشرات على حسابها ، استمرت الأعمدة هي من تستفيد من منظور الأداء - أعتقد أن عليك أن تحاول/اختبار المحددة الخاصة بك الأعراف

(آمل أن أكون قد ساعدت!)

وأنا أقترح على أبسط بعض الشيء:

 cast(cast([datetime_column] as int) as datetime)

ولكن أظن أنك سوف تعمل في نفس المشكلة.

والآن إذا كانت المشكلة هي في صب مرة أخرى إلى التاريخ والوقت، قد ترغب في النظر في استخدام فقط cast([datetime_column] as int) كحقل مستقل، لمجرد مؤشر.

انظر هذا سؤال و الإجابة عليها من قبل كايد رو.ربما كان الحل في إنشاء دالة باستخدام مع SCHEMABINDING ومن ثم استخدامها في عمود محسوب

تحرير

وأنا أفهم أن كنت الهدف من ذلك هو أن تكون قادرة على أن يكون مؤشر على هذا العمود.

إذا كان هذا لا يمكن القيام به مع عمود محسوب ثم ربما يكون الخيار الوحيد لخلق عادي عمود و تعديل البيانات في هذا العمود في كل مرة تقوم بتحديث واحد هو على أساس.(القول في الزناد)

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