SQL Serverのマルチ計算カラムは、同じ列を参照します

著作権:コピー、ソースを明記してくださいhttps://blog.csdn.net/weixin_39392627/article/details/86710466

ENV:のWindows Server 2016

       SQL Server 2012のSP1

このタイトルは、について話すことは何も存在しないことを感じている必要があり、プラスダイレクトライン計算フィールドは、それを行うことはできませんか?

私も本当にそう思いますが、いませんでした~~

シナリオ:00も07、::TESTTB01がフィールドを作成するテーブルがあり、データ形式があるのDateTimeOffset、タイムゾーン08があります00。日付情報はどの日に決定するために必要。しかし、異なるタイムゾーンに差異がさかのぼります。

したがって、情報はその日の一部で見つけて、クエリのパフォーマンスを最適化するために、計算フィールドを使用します。

資料約5億筆

同じフィールド1.直接参照テーブル、フィールド算出された3株の樹立。

コマンド:

ALTER TABLE [dbo].[TESTTB01] ADD CreateDate AS (CONVERT(date, Created)) PERSISTED;
GO

ALTER TABLE [dbo].[TESTTB01] ADD CreateUTC AS (Created AT TIME ZONE 'UTC') PERSISTED;
GO

ALTER TABLE [dbo].[TESTTB01] ADD CreateUTCDate AS (CONVERT(date, (Created AT TIME ZONE 'UTC'))) PERSISTED;
GO

行の値が4時間以上、エラー

メッセージ4936、レベル16、状態1、行4

列が非決定論的であるため、表で計算列「CreateUTC」「TESTTB01」を持続することはできません。

メッセージ4936、レベル16、状態1、行6

列が非決定論的であるため、表で計算列「CreateUTCDate」「TESTTB01」を持続することはできません。

 

2.空気のテストテーブルを再確立するようにしてください:TESTTB01_NEWを

コマンド:

CREATE TABLE [dbo].[TESTTB01_NEW](
[Id] [uniqueidentifier] NOT NULL,
[Status] [int] NOT NULL,
[Created] [datetimeoffset](7) NOT NULL,
 CONSTRAINT [PK_TESTTB01_NEW] PRIMARY KEY NONCLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

3.機能を確立し、計算フィールドを設定

コマンド:

CREATE FUNCTION dbo.FnCreateUTC(@DATE datetimeoffset)  
RETURNS datetimeoffset
AS  
BEGIN  
     DECLARE @CreateUTC DATETIMEOFFSET;  
     SELECT  @CreateUTC= (Created AT TIME ZONE 'UTC') FROM dbo.TESTTB01_NEW
     RETURN(@CreateUTC);  
END;  
GO

ALTER TABLE [dbo].[TESTTB01_NEW] ADD CreateUTC AS dbo.FnCreateUTC(created) PERSISTED;
GO

エラーメッセージは使用できませんPERSISTED

メッセージ4936、レベル16、状態1、行49

列が非決定論的であるため、計算列テーブル「CreateUTC」「TESTTB01_NEW」を持続することができません

 

4.使用されていない永続化

コマンド:

ALTER TABLE [dbo].[TESTTB01_NEW] ADD CreateUTC AS dbo.FnCreateUTC(created) ;
GO

 

二つのフィールドに補足計算、利用機能、使用されていない機能

コマンド:

ALTER TABLE [dbo].[TESTTB01_NEW] ADD CreateUTC AS dbo.FnCreateUTC(created);
GO

ALTER TABLE [dbo].[TESTTB01_NEW] ADD CreateUTCDate AS (CONVERT(date, (Created AT TIME ZONE 'UTC')));
GO

 

結論:各フィールドは唯一のタイプフィールドを参照して算出することができるが、関数の使用に限定されません

ステップ3では、悪い書き込み、この機能のパフォーマンスの低下、はるかに優れたパフォーマンスを機能用コンテンツです

     DECLARE @CreateUTCDate DATETIMEOFFSET;  

     SET @CreateUTCDate= (CONVERT(date, (@DATE AT TIME ZONE 'UTC')))

 

おすすめ

転載: blog.csdn.net/weixin_39392627/article/details/86710466