2010-05-10 59 views
3

我正在向表中添加一個新的GUID/Uniqueidentifier列。使用NEWSEQUENTIALID()更新觸發器

ALTER TABLE table_name 
ADD VersionNumber UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWSEQUENTIALID() 
GO 

而且當表中更新記錄時,我想要更新此列「VersionNumber」。所以,我創建了一個新的觸發

CREATE TRIGGER [DBO].[TR_TABLE_NAMWE] 
ON [DBO].[TABLE_NAME] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE TABLE_NAME 
    SET VERSIONNUMBER=NEWSEQUENTIALID() 
    FROM TABLE_NAME D 
    JOIN INSERTED I ON D.ID=I.ID/* some ID which is used to join*/ 
END 
GO 

但剛剛意識到NEWSEQUENTIALID()只能用CREATE TABLEALTER TABLE使用。我得到這個錯誤

The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression. 

有沒有解決方法呢?

EDIT1:在觸發更改NEWSEQUENTIALID()NEWID()解決了這一點,但我索引此列,並使用NEWID()將是次優的

回答

9

正如你說,它在一定條件下才能使用,你可以做一些討厭像:

DECLARE @T TABLE (G UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID()) 
INSERT @T OUTPUT INSERTED.G VALUES (DEFAULT) 

是否必須是GUID?如果您使用的是rowversion,則無需觸發器即可獲得相同的功能以及更好的索引性能。

+0

+1 rowversion(又名時間戳):) – Nate 2010-05-10 14:35:20

+1

+1很不幸,確實 - 但'NEWSEQUENTIALID()'只能作爲列的DEFAULT值 - 似乎是相同的2008 R2,也: - ( – 2010-05-10 14:50:42

+2

微軟在8年內沒有觸及過這個問題;這是一個諷刺,當你試圖修改一個以newsequentialid()作爲默認值的表時,SSMS 2012仍然會拋出驗證列的錯誤,這些變通辦法包括創建臨時表,一個獨特的ID是不可接受的,儘管這可能是迄今爲止最好的解決方法。 – Triynko 2013-11-02 00:42:17