4

IIS ログ テーブルに対して次のことを実行しようとしています。

ALTER TABLE [W3CLog]
ADD [LogTime] AS [date] + ([time] - '1900-01-01') PERSISTED

ただし、SQL Server 2008 では次のように表示されます。

テーブル 'W3CLog' の計算列 'LogTime' は、列が非決定論的であるため、永続化できません。

テーブルには次の定義があります。

CREATE TABLE [dbo].[W3CLog](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    ...
    [date] [datetime] NULL,
    [time] [datetime] NULL,
    ...
)

なぜそれは非決定論的なのですか?

私は本当にそのフィールドにインデックスを付ける必要があります。現在、テーブルには 1598170 行あり、フルタイムでインデックス シークを実行できない場合、クエリを実行するのは困難です。これは他のいくつかのログ形式と UNION されているため、2 つの列を別々に使用することは非常に簡単ではありません。

4

2 に答える 2

4

言語'1900-01-01'設定に依存するため、は非決定論的です。もちろん、これはDMYまたはMDY設定の場合は明確ですが、一般的にはあいまいです。

試してみてください'19000101':SQL Serverは日付と時刻をやや奇妙に扱います:理論的にはISOであるにもかかわらず、英国の設定がある場合、「yyyy-mm-dd」は「yyyy-dd-mm」として扱うことができます

編集:これを使用して日付アスペクトを削除します:DATEADD(day, 0, DATEDIFF(day, 0, [time]))

Edit2:1900年1月1日は日時形式ではゼロなので、減算する必要はありません。サンプルデータを投稿して出力していただけますか?

于 2010-06-14T12:56:24.100 に答える
0

了解しました。@gbnの回答のおかげでわかりました。

次の3つは同等です。

SELECT TOP 100
    [date] + ([time] - '19000101'),
    [date] + ([time] - 0),
    [date] + [time]
FROM
    dbo.[W3CLog]

底は決定論的です。

于 2010-06-14T13:00:15.997 に答える