1

在存储过程中(使用 SQL Server 2008 R2 SP2)是否可以在NewSequentialID()没有临时表变量的情况下返回 a?

NewSequentialID()我可以通过使用临时表成功获得:

在插入时获取 NEWSEQUENTIALID() 的值

也许我是老派,但除非绝对必要,否则我尽量避免使用临时表……尽管这可能是绝对必要的情况……</p>

如果我尝试:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()

......它按预期工作。

如果我尝试:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()

…我收到以下错误:

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

  • 是使用临时表方法的唯一解决方案吗?
  • 有谁知道微软为什么在NEWSEQUENTIALID()to work like之间实现区别的原因NEWID()
  • 任何人都知道微软是否有机会更新NEWSEQUENTIALID()为像这样工作NEWID()

地理

更新——我不确定微软为什么选择以这种方式实现该方法,因为他们声明“NEWSEQUENTIALID 是 Windows UuidCreateSequential 函数的包装器”......但似乎没有非临时变量表法。(至少到目前为止。)
感谢大家的评论/回答。[主持人注意:]当答案是“不可能”时,我不确定如何处理问题。所以我要感谢@marc_s 详细介绍了一种解决方法。

4

2 回答 2

3

目前-newsequentialid()只能用作列的默认约束。这也是错误消息非常清楚地说明的内容。

所以为了得到你的顺序 GUID - 你必须有一个表。没有其他方法可以做到这一点。在 SQL Server 2012 中也没有其他方法。

我不知道也没有任何信息说明为什么会有这样的差异,以及为什么微软选择以这种方式实现它......

更新:

好的,所以您需要获取插入到表中的值 - 使用该OUTPUT子句怎么样?

就像是:

DECLARE @NewIDs TABLE (NewSeqID UNIQUEIDENTIFIER)

INSERT INTO dbo.YourTable(list-of-columns)
OUTPUT INSERTED.NewSeqID INTO @NewIDs(NewSeqID)
VALUES (.........)

这样,INSERT操作的输出 - 新创建的顺序 GUID - 被存储到该表变量中,您可以使用它,返回它,切片它 - 任何你喜欢的!

于 2012-08-12T19:29:46.243 回答
1

微软官方的说法是:

NEWSEQUENTIALID() 只能与 uniqueidentifier 类型的表列上的 DEFAULT 约束一起使用。例如: CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())

此处描述 http://msdn.microsoft.com/en-us/library/ms189786.aspx

NewID generates a random number and the other is the next sequential number.

于 2012-08-12T19:36:00.657 回答