首页 > 解决方案 > 是否可以在表的默认子句中创建一些 GUID?

问题描述

我想用 newid() 的 newsequentialid() 函数生成一些 GUID

CREATE TABLE AssetPoints 
(
    Id int IDENTITY(1,1) PRIMARY KEY, 
    AssetOwner uniqueidentifier,
    assetValue int, 
    RV rowversion
);  
GO   

declare @i int = 0
while (@i < 10)
begin
    INSERT INTO AssetPoints (AssetOwner, assetValue) VALUES (newsequentialid(), 1000 + @i);
    set @i = @i + 1
end
GO   

但出现以下错误:

newsequentialid() 内置函数只能用于 CREATE TABLE 或 ALTER TABLE 语句中类型为“uniqueidentifier”的列的 DEFAULT 表达式。它不能与其他运算符组合形成复杂的标量表达式。

是否可以按顺序使用创建一些 GUID newsequentialid()?还是newsequentialid()在表的默认子句中使用 NOT ONLY?

标签: sql-server

解决方案


还是不仅仅在表的默认子句中使用 newsequentialid() ?

例如,如果您想要 1000 个顺序 guid,可能是出于临时原因,或者在您实际上没有永久表可以放入它们的情况下,那么您仍然可以遵守 SQLServer 的“仅在列默认值中”的坚持,方法是具有该默认值的表变量,并将其插入(省略 guid 列以便生成默认值):

DECLARE @t TABLE(g UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(), x CHAR(1));
INSERT INTO @t(x) SELECT TOP 1000 'x' FROM some_big_table
SELECT g FROM @t

然后,您可以将这 1000 个 guid 用于您需要的任何东西。也许您想将它们插入到需要 guid 但不生成自己的(或生成随机的)等的表中,所以您可以这样做INSERT INTO PersonTest SELECT g, 'John', Smith' FROM @t...

还有其他方法可以生成任意 1000 行;我只是在这里选择了一个简单的方法,即从一个超过 1000 行的大表中选择 1000 行。如果没有超过 1000 行的表,请查看其他方式


推荐阅读