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