2011-12-03 58 views
1

我有如下表:獲取在SQL Server 2008中自動遞增字段值

tbl_ProductCatg

Id IDENTITY 
Code 
Description 
a few more. 

Id字段是自動遞增,我要插入代碼字段這個字段值。

即,如果生成的ID是1,那麼在代碼字段的值應插入像0001(格式化爲具有四個長度)時,如果ID是77碼應該是0077

對於這一點,我提出的查詢像:

insert into tbl_ProductCatg(Code,Description) 
values(RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4),'testing') 

該查詢運行良好,在SQL Server查詢分析器,但如果我寫這在C#則在代碼甚至ID字段更新以及鑲石空。

感謝

回答

4

你可能想看看Computed ColumnsDefinition

從什麼聽起來像你正在嘗試做的,這會爲你工作。

CREATE TABLE tbl_ProductCatg 
(
    ID INT IDENTITY(1, 1) 
    , Code AS RIGHT('000' + CAST(ID AS VARCHAR(4)), 4) 
    , Description NVARCHAR(128) 
) 

ALTER TABLE tbl_ProductCatg 
ADD Code AS RIGHT('000' + CAST(id AS VARCHAR(4)), 4) 

您還可以使列是PERSISTED所以不計算每次被引用時。

將列標記爲PERSISTED指定數據庫引擎將物理地將計算值存儲在表中,並在計算列所依賴的任何其他列被更新時更新值。

+0

非常感謝......... –

+0

通過@Adam溫格描述。 –

0

不幸的是,SCOPE_IDENTITY並非設計用於插入過程中,因此只有在插入操作發生後纔會填充該值。

我可以看到,這樣做的三種解決方案將使存儲過程生成範圍標識,然後對字段進行更新。

insert into tbl_ProductCatg(Description) values(NULL,'testing') 
update tbl_ProductCatg SET code=RIGHT('000'+ltrim(Str(SCOPE_IDENTITY()+1,4)),4) WHERE id=SCOPE_IDENTITY() 

第二種選擇,是採取這一步更進一步,使這成爲一個觸發器,它在UPDATE和INSERT上運行。我總是被教導儘可能地避免觸發器,而是在SP級別做事情,但在某些情況下觸發器是合理的。

第三個選項是計算領域,@SupriyaSrivastava非常歡迎

+0

SQL服務器的計算列允許列爲'PERSISTED'。這意味着該值在插入時計算,然後與傳統列相似地存儲。這消除了讀取時多個計算的後端。 –

+0

非常有趣,我需要牢記這一點,謝謝! –

相關問題