前言
上一節(jié)我們結(jié)束了Hash Match Aggregate和Stream Aggregate的講解,本系列我們來(lái)講講關(guān)于SQL Server中的計(jì)算列問(wèn)題,簡(jiǎn)短的內(nèi)容,深入的理解,Always to review the basics。
初探計(jì)算列持久化(Compued Column Persisted)
在SQL Server 2005就引入了計(jì)算列,我們首先稍微看下在msdn關(guān)于計(jì)算列的定義:計(jì)算列由可以使用同一表中的其他列的表達(dá)式計(jì)算得來(lái)。表達(dá)式可以是非計(jì)算列的列名、常量、函數(shù),也可以是用一個(gè)或多個(gè)運(yùn)算符連接的上述元素的任意組合。表達(dá)式不能為子查詢。實(shí)際上就是為了定義一個(gè)列來(lái)對(duì)其他列來(lái)進(jìn)行計(jì)算可以是列名、函數(shù)等,那么它的使用場(chǎng)景是什么呢?下面我們首先來(lái)舉個(gè)例子。當(dāng)需要導(dǎo)出一些值時(shí),此時(shí)這些值需要通過(guò)計(jì)算才能被導(dǎo)出,同時(shí)呢,有一些列還依賴于另外的一列或者更多列,如果一個(gè)列進(jìn)行了更新則其依賴的列必須同步進(jìn)行更新,上述場(chǎng)景通過(guò)對(duì)一個(gè)列或者多個(gè)列進(jìn)行計(jì)算,此時(shí)我們需要定義一個(gè)將一個(gè)列或者多個(gè)列進(jìn)行計(jì)算得到的值的列,這就是計(jì)算列。我們來(lái)看一個(gè)典型的例子,在一個(gè)公司上班的所有員工,在公司內(nèi)部系統(tǒng)中會(huì)存其所有員工的信息,比如員工編號(hào)、出生日期等,如果此時(shí)我們需要導(dǎo)出員工的退休日期呢,假設(shè)在中國(guó)現(xiàn)在男性退休時(shí)間為60年后,此時(shí)我們需要通過(guò)出生日期算出60年后的日期,也就說(shuō)在表中還需要定義一個(gè)退休日期列。下面我們創(chuàng)建表來(lái)看看計(jì)算列。
USE TSQL2012 GO CREATE TABLE Employee ( employeeNumber INT NOT NULL, --員工編號(hào) employeeBirth DATETIME NOT NULL, --出生日期 employeeRetirement AS (DATEADD(YEAR, 60, (employeeBirth)-(1))) PERSISTED --退休日期)
此時(shí)我們看到表中關(guān)于退休日期的設(shè)計(jì),顯示其已經(jīng)是持久化了的
接下來(lái)我們插入測(cè)試數(shù)據(jù)看看