sql-server - 是否可以在表的默认子句中创建一些 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?
解决方案
还是不仅仅在表的默认子句中使用 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 行的表,请查看其他方式
推荐阅读
- php - 在php中的数据库中插入表单输入值
- java - 当原始地图包含集合作为值时如何创建反向地图?
- authentication - Cognito - 使用电子邮件注册,使用首选用户名登录
- wpf - 如果我从代码中设置名称,Template.FindName 不起作用
- mysql - MYSQL:显示来自两个不相关表的 select 语句的一个查询
- msmq - MSMQ 毒消息是什么意思?
- python - 使用自动文本字段填充自动进行静默安装
- angular - 在拦截时如何传递不同的 Content-Type 我们把 content type = 'Content-Type': 'application/json',
- java - 如何进行折扣计算
- ruby - 基于条件的 Rspec 测试