SQL Server计算列
计算列由可以使用同一表中的其他列的表达式计算得来。表达式可以是非计算列的列名、常量、函数,也可以是用一个或多个运算符连接的上述元素的任意组合。表达式不能为子查询。
例如,在 AdventureWorks 示例数据库中,Sales.SalesOrderHeader 表的 TotalDue 列具有以下定义:TotalDue AS Subtotal + TaxAmt + Freight。
除非另行指定,否则计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。数据库引擎在 CREATE TABLE 和 ALTER TABLE 语句中使用 PERSISTED 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值。通过将计算列标记为 PERSISTED,可以对具有确定性但不精确的计算列创建索引。另外,如果计算列引用 CLR 函数,则数据库引擎不能验证该函数是否真正具有确定性。在这种情况下,计算列必须为 PERSISTED,以便可对其创建索引。
计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何可使用正则表达式的其他位置,但下列情况除外:
用作 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED。如果计算列的值由具有确定性的表达式定义,并且索引列中允许使用计算结果的数据类型,则可将该列用作索引中的键列,或者用作PRIMARY KEY 或 UNIQUE 约束的一部分。
例如,如果表中含有整数列 a 和 b,则可以对计算列 a + b 创建索引,但不能对计算列 a + DATEPART(dd, GETDATE()) 创建索引,因为在后续调用中,其值可能发生改变。
计算列不能作为 INSERT 或 UPDATE 语句的目标。
数据库引擎基于使用的表达式自动确定计算列的为 Null 性。即使只有非空列,大多数表达式的结果也“认为”可为空值,因为下溢或溢出生成的结果也可能为空。使用带 AllowsNull 属性的 COLUMNPROPERTY 函数可查明表中任何计算列的为 Null 性。通过指定 ISNULL (check_expression, constant) 可以将可为空值的表达式转换为不可为空值的表达式,其中, constant 是可替换所有空结果的非空
创建表时使用计算列的利弊,计算列持久化的含义
在数据库表设计的时候有一个比较特殊的列不填写任何设计类型,用户不可以改变该列的值,这就是计算列。计算列的值是通过一定的函数公式等以另一个或多个列的值为输入值,计算出结果。 打开表或在新建表的时候,在列属性下面就有"计算所得的列规范"项,在"公式"中填入需要的公式便完成计算列的设计。
优点:
1、计算列不能引用其他表的列,但是可以通过函数来实现。
2、如果在计算列的计算更改时涉及任何列,将更新计算列的值。通过将计算列标记为 PERSISTED,可以对具有确定性但不精确的计算列创建索引。
3、在sql server中想使用某个数据,而这个数据又不在表中,这时候可以使用计算列。
4、可以将索引建立在计算列上。一旦你创建了计算列,你就可以用几个目录视图来观察和计算与列相关的元数据。
5、在不需要创建视图的情况下,该"虚拟列"就可以作为SELECT语句的一部分进行输出。对于不用"难懂的"代码就实现"行内非规范化"来说,这是种完美的做法。
缺点:
1、 在计算列中不能直接写比较复杂的逻辑,一般要结合自定义函数和计算列,这样就可以完成各种复杂逻辑了。
2、 计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。
3、 如果计算列引用 CLR 函数,则数据库引擎不能验证该函数是否真正具有确定性。在这种情况下,计算列必须为 PERSISTED,以便可对其创建索引。
4、 计算列不能作为 INSERT 或 UPDATE 语句的目标。
5、 计算列有一个可以说是危险的功能:如果你在插入数据时忽略了插入字段的列表,则计算列会被略过。SQL Server会忽略任何计算列,逐个匹配别的字段,就好像计算列不存在一样。
计算列持久化的含义:
SQL Server 所作的重大改进是提供了在列内自动持久化数据的能力,这样你就不必每次取一行都进行计算。只对使用确定性函数(对相同的输入,它们永远都返回相同的输出)的公式才提供了这种持久化功能。GETDATE()是非确定性的,基于时间不同,它返回不同的日期值;而UPPER是确定性的,只要用相同的参数运行该函数,它每次都返回相同的值。持久化可以提高下性能。
计算列的持久化:物理存储的表的计算列。计算中涉及的任何列更改时,持久化计算列的值即更新。当对某个计算列应用了持久化属性时,如果该列为确定列但不精确,可以对该列创建索引。计算列能用在索引中,但是一定要符合一些条件。比如是确定的(对于一组给定的输入总是返回相同的结果)和精确的(不包含浮点值)
利 对于需要计算值或者通过处理其他列来产生值的情况,我们在SQL Server中有一个更强大有效的功能。这个功能是“计算列”。创建计算列可以改进具体环境中的性能。并且,用户可以根据具体情况,在需要使用持久化技术时,创建持久化计算列。
持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
● 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
● 代码重用性高,能够完成大部分数据库操作;
● 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码
弊 计算列由可以使用同一表中的其他列的表达式计算得来。除非另行指定,否则计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。如果在计算列的计算更改时涉及任何列,将更新计算列的值。计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何可使用正则表达式的其他位置,但下列情况除外:用作 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED.计算列不能作为INSERT 或 UPDATE 语句的目标。
SQL Server计算列的更多相关文章
- SQL Server 关于列的权限控制
在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚了解,已经被人问了几次了,所以还是在这里介绍一下,很多人都会问,我能否单独对表的某列授 ...
- SQL Server 索引列的顺序——真的没关系吗
原文:SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/2718/sql-server-index-column- ...
- sql server 计算属性,计算字段的用法与解析
SQL学习之计算字段的用法与解析 一.计算字段 1.存储在数据库表中的数据一般不是应用程序所需要的格式.大多数情况下,数据表中的数据都需要进行二次处理.下面举几个例子. (1).我们需要一个字段同 ...
- 模拟实现SQL Server字段列显示的数据类型
本文目录列表: 1.SQL Server表设计视图中的数据类型列展示效果 2.模拟实现类似的数据类型显示效果 3.测试效果 4.总结语 5.参考清单列表 1.SQL Server表设计视图中的数据 ...
- 使用sql语句创建修改SQL Server标识列(即自动增长列)
一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...
- SQL Server 2012 列存储索引分析(翻译)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- SQL Server 一列或多列重复数据的查询,删除
业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入目标数据库的数据不能出现重复.但情况是数据源本身就有重复的数据.所以要先清除数据源数据. 于是就把关 ...
- SQL Server 一列或多列重复数据的查询,删除(转载)
转载来源:https://www.cnblogs.com/sunxi/p/4572332.html 业务需求 最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库).要求导入 ...
- SQL Server 2012 列存储索引分析(转载)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
随机推荐
- 【转帖】Dubbo:来自于阿里巴巴的分布式服务框架
http://www.biaodianfu.com/dubbo.html Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被 ...
- 《开源框架那点事儿23》:採用TinyDB组件方式开发
採用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发反复功能时.能够利用已有的组件库高速开发.对于开发者而言仅仅须要简单配置流程就能够完毕工作了.开发增删 ...
- resharper警告 :linq replace with single call to FirstOrDefault
使用resharper时对linq使用的FirstOrDefault 一直产生一个警告,
- Object-C中的字符串对象1-不可变字符串
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- 分享一个mysql 复杂查询的例子
发布:脚本学堂/MySQL 编辑:thebaby 2013-08-23 09:37:37 [大 中 小] 有关mysql复杂查询的一个例子,正在学习mysql的朋友,可以作为一个参考. 在my ...
- 判断是否是IE浏览器和是否是IE11
判断是否是IE浏览器用下面这个函数, function isIE() { //ie? 是ie返回true,否则返回false if (!!window.ActiveXObject || "A ...
- swift 继承和构造器
继承 class Vehicle { var numberOfWheels: Int var maxPassengers: Int func description() -> String { ...
- 【C语言】19-static和extern关键字1-对函数的作用
一.extern与函数 在前面我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.o ...
- css 优先级的bug
对于前端而言,了解css样式的优先级,对开发或处理bug有着事半功倍的效果,今天在做项目的时候,突然碰到一个优先级的小问题,刚开始不知道所因,后来才发现这个问题是由优先级造成的.先描述下问题,鼠标悬停 ...
- mouseover mouseenter mouseout mouseleave
mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件. mouseou ...