計算列

釋懷355發表於2013-07-11
計算列是虛擬列,並非實際儲存在表中,除非此列標記為 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章