使用带有UPDATE触发器的NEWSEQUENTIALID()

时间:2010-05-10 13:48:28

标签: sql-server sql-server-2008 triggers guid newsequentialid

我在我的表中添加了一个新的GUID / Uniqueidentifier列。

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()将是次优的

1 个答案:

答案 0 :(得分:9)

正如你所说,它只能在某些条件下使用,你可以做一些令人讨厌的事情,如:

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

它必须是GUID吗?如果您使用rowversion,则可以获得相同的功能而无需触发器以及更好的索引性能。