USE tempdb;
GO
CREATE TABLE dbo.example
(
name sysname PRIMARY KEY,
rowguid uniqueidentifier NOT NULL DEFAULT NEWID() ROWGUIDCOL
);
INSERT dbo.example(name) VALUES(N'bob'),(N'frank');
SELECT * FROM dbo.example;
UPDATE dbo.example SET name = N'pat' WHERE name = N'bob';
UPDATE dbo.example SET name = N'bob' WHERE name = N'frank';
SELECT * FROM dbo.example;
DROP TABLE dbo.example;
SET NOCOUNT ON;
CREATE TABLE #RowGuidColTest
(
ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()) ROWGUIDCOL,
SomeValue INT
);
INSERT INTO #RowGuidColTest (SomeValue) VALUES (12), (14), (1231);
DECLARE @Search UNIQUEIDENTIFIER;
SELECT TOP (1) @Search = $ROWGUID
FROM #RowGuidColTest;
SELECT @Search AS [@Search]
SELECT *, $ROWGUID AS [$ROWGUID]
FROM #RowGuidColTest;
SELECT *
FROM #RowGuidColTest
WHERE $ROWGUID = @Search;
-- No enforced uniqueness without a PK, Unique Index, or Unique Constraint.
UPDATE tmp
SET $ROWGUID = @Search
FROM #RowGuidColTest tmp
SELECT *
FROM #RowGuidColTest
WHERE $ROWGUID = @Search;
返回类似于:
@Search
E7166D18-5003-4D20-8983-E2402472CF82
ID SomeValue $ROWGUID
E7166D18-5003-4D20-8983-E2402472CF82 12 E7166D18-5003-4D20-8983-E2402472CF82
44FD48A4-AF38-41BF-AE4E-8A12D26B5B57 14 44FD48A4-AF38-41BF-AE4E-8A12D26B5B57
2D50C5C7-1E43-4ADA-A03B-ED202FC88D20 1231 2D50C5C7-1E43-4ADA-A03B-ED202FC88D20
ID SomeValue
E7166D18-5003-4D20-8983-E2402472CF82 12
ID SomeValue
E7166D18-5003-4D20-8983-E2402472CF82 12
E7166D18-5003-4D20-8983-E2402472CF82 14
E7166D18-5003-4D20-8983-E2402472CF82 1231
ROWGUIDCOL
主要用于MERGE 复制,也是MERGE 复制所必需的FILESTREAM
,但可以在您希望将不可变列与主键分开的任何情况下使用(例如,在主键值可以更改但您仍然希望成为能够分辨出更改前后哪一行是哪一行)。现在,如果复制、您的应用程序或您正在关注的内容,它会注意到:
有关更多信息,请参见此处、此处和此处的“快照注意事项”部分。
将列标记为
ROWGUIDCOL
允许通过$ROWGUID
查询引用它。这允许使查询更通用,因为您不需要在每个表中查找“唯一”列是什么(这对于 @Aaron 和 @Martin 分别指出的 Replication 和 FileStream 等功能非常有用)。您可以在应用程序层或什至在动态 SQL 中构造一个查询,它执行类似的操作SELECT $ROWGUID AS [ID] FROM {table_name}
并简单地遍历表列表。请记住,该
ROWGUIDCOL
名称并不强制执行唯一性。您仍然需要通过主键、唯一索引或唯一约束来强制执行。此选项也不强制该列是不可变的。为此,您需要对该列的AFTER UPDATE
触发器或列级权限DENY UPDATE
。例如:
返回类似于:
同样,可以
$IDENTITY
用于具有一IDENTITY
列的表。