计算列

计算列是虚拟列,并非实际存储在表中,除非此列标记为 PERSISTED。该列由同一表中的其他列通过表达式计算得到。例如,计算列可以定义为 cost AS price * qty。 表达式可以是非计算列的列名、常量、函数、变量,也可以是用一个或多个运算符连接的上述元素的任意组合。 表达式不能是子查询,也不能包含别名数据类型。

计算列可用于选择列表、WHERE 子句、ORDER BY 子句或任何可使用正则表达式的其他位置,但下列情况除外:
         计算列不能用作 DEFAULT 或 FOREIGN KEY 约束定义,也不能与 NOT NULL 约   束定义一起使用。但是,如果计算列的值由具有确定性的表达式定义,并且索引列中允许计算结果的数据类型,则可将该列用作索引中的键列,或用作 PRIMARY KEY 或 UNIQUE 约束的一部分。

         例如,如果表中含有整数列 ab,则可以对计算列 a+b 创建索引,但不能对计算列 a+DATEPART(dd, GETDATE()) 创建索引,因为在以后的调用中,其值可能发生改变。

        计算列不能作为 INSERT 或 UPDATE 语句的目标。

       表中计算列所使用的列值因行而异,因此计算列的每一行可能有不同的值。

只有同时指定了 PERSISTED 时,才能为计算列指定 NOT NULL。

计算列上的 CHECK 约束也必须标记为 PERSISTED。

计算列上的外键也必须标记为 PERSISTED。

计算列的为 Null 性是由数据库引擎根据使用的表达式自动确定的。即使只有不可为空的列,大多数表达式的结果也认为是可为空的,因为可能的下溢或溢出也将生成 NULL 结果。使用带 AllowsNull 属性的 COLUMNPROPERTY 函数可查明表中任何计算列的为 Null 性。通过与 check_expression 常量一起指定 ISNULL(其中,常量是替换所有 NULL 结果的非空值),可以将可为空的表达式转换为不可为空的表达式。对于基于公共语言运行时 (CLR) 用户定义类型表达式的计算列,需要对此类型有 REFERENCES 权限。(当前其实对这段话我不是很懂)

eg1:

create table dbo.test
(
    co11 int ,
    col2  as (co11+col3),
    col3 int
)

插入数据时可以视不存在计算列

insert into dbo.test
select 1,1

select * from dbo.test

co11    col2    col3
1           2          1

eg2:

create function dbo.f_getvalue(@intValue int)
returns float
as
begin
    return (@intValue +3) * 0.5 % 12 + 3 *12/0.6
end

create table dbo.test
(
    co11 int ,
    col2  as f_getvalue(co11),
    col3 int
)

运行提示错误:

Msg 195, Level 15, State 10, Line 4
'f_getvalue' is not a recognized built-in function name.


知道原因了,如果改成以下的情况就可以了

create table dbo.testcomputecolumn
(
    co11 int ,
    col2  as dbo.f_getvalue(co11),
    col3 int
)

这样就可以成功,为什么呢?我网上看到别人是这么说的,我觉得是对的:

SQL Server scalar user defined functions must be called using 2 part names. You will see this error if you attempt to call the functions using a 1 part name.

So if your function name is "function1" and is defined in the dbo schema, then instead of

"select function1()" you should call it as "select dbo.function1()"




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27026361/viewspace-766080/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27026361/viewspace-766080/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值