2010-05-10 35 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