Gre*_*ers 6 sql guid sql-server-2012
这是我正在查看的表的简化版本:
CREATE TABLE [dbo].[FrustratingTable]
(
[Id] Uniqueidentifier NOT NULL
, [SecondField] [datetime]
, [ThirdField] varchar(128)
)
Run Code Online (Sandbox Code Playgroud)
我想在此表中插入新记录.我尝试了3种方法:
INSERT INTO [dbo].[FrustratingTable] (Id, SecondField, ThirdField)
SELECT newid() as Id,
'6/25/2015' as SecondField, 'Example' as ThirdField
Run Code Online (Sandbox Code Playgroud)
这种方法插入,但结果键不是一个很好的顺序GUID,就像表中的其他键
INSERT INTO [dbo].[FrustratingTable] (Id, SecondField, ThirdField)
SELECT NEWSEQUENTIALID() as Id, '6/25/2015' as SecondField, 'Example' as ThirdField
Run Code Online (Sandbox Code Playgroud)
这失败了,错误
newsequentialid()内置函数只能在CREATE TABLE或ALTER TABLE语句中的"uniqueidentifier"类型的列的DEFAULT表达式中使用.它不能与其他运算符组合以形成复杂的标量表达式.
INSERT INTO [dbo].[FrustratingTable] (SecondField,ThirdField)
SELECT '6/25/2015' as SecondField, 'Example' as ThirdField
Run Code Online (Sandbox Code Playgroud)
这失败了,错误
无法将值NULL插入列'id',表'mydatabase.dbo.frustratingtable'; 列不允许空值.INSERT失败.
是否有可能在不改变表定义的情况下解决这个问题?
Dam*_*ver 14
您可以通过使用表变量来执行此操作:
declare @t table (
ID uniqueidentifier not null default newsequentialid(),
SecondField datetime,
ThirdField varchar(128)
)
insert into @t (SecondField,ThirdField)
output inserted.ID,inserted.SecondField,inserted.ThirdField
into FrustratingTable
values
('20150101','abc'),
('20150201','def'),
('20150301','ghi')
select * from FrustratingTable
Run Code Online (Sandbox Code Playgroud)
结果:
Id SecondField ThirdField
------------------------------------ ----------------------- ------------
1FEBA239-091C-E511-9B2F-78ACC0C2596E 2015-01-01 00:00:00.000 abc
20EBA239-091C-E511-9B2F-78ACC0C2596E 2015-02-01 00:00:00.000 def
21EBA239-091C-E511-9B2F-78ACC0C2596E 2015-03-01 00:00:00.000 ghi
Run Code Online (Sandbox Code Playgroud)
由于表变量通过a设置值default,我们可以使用NEWSEQUENTIALID().
当然,对于非常大的数据集,暂时存在两个潜伏的数据副本会受到惩罚.
另一种方法是使用一种名为COMB的旧解决方案,它在之前使用过NEWSEQUENTIALID():
SELECT CAST(CAST(NEWID() AS BINARY(10)) + CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
Run Code Online (Sandbox Code Playgroud)
产生uniqueidentifiers比NEWID()本身更好的局部性.
| 归档时间: |
|
| 查看次数: |
8969 次 |
| 最近记录: |