Sql server 2008 r2 在存储过程(SQL Server 2008 R2 SP2)中,是否可以返回不带临时表变量的NewSequentialID()?

Sql server 2008 r2 在存储过程(SQL Server 2008 R2 SP2)中,是否可以返回不带临时表变量的NewSequentialID()?,sql-server-2008-r2,temp-tables,newsequentialid,Sql Server 2008 R2,Temp Tables,Newsequentialid,在使用SQL Server 2008 R2 SP2的存储过程中,是否可以返回不带临时表变量的NewSequentialID 我可以使用临时表成功获取NewSequentialID: 也许我是老派,但我尽量避免使用临时表,除非绝对必要…尽管这可能是绝对必要的情况 如果我尝试: DECLARE @NewSequentialID UNIQUEIDENTIFIER; SET @NewSequentialID = NEWID() DECLARE @NewSequentialID UNIQUEIDENTI

在使用SQL Server 2008 R2 SP2的存储过程中,是否可以返回不带临时表变量的NewSequentialID

我可以使用临时表成功获取NewSequentialID:

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

如果我尝试:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()
…它按预期工作

如果我尝试:

DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWID()
DECLARE @NewSequentialID UNIQUEIDENTIFIER;
SET @NewSequentialID = NEWSEQUENTIALID()
…我收到以下错误:

newsequentialid内置函数只能在默认情况下使用 创建表中“uniqueidentifier”类型列的表达式 或ALTER TABLE语句。它不能与其他运算符组合 形成一个复杂的标量表达式

是使用临时表方法的唯一解决方案吗? 有人知道为什么微软在NEWSEQUENTIALID和NEWID之间实现了区别吗? 有人知道微软是否有机会更新NEWSEQUENTIALID,使其像NEWID一样工作吗? 地理位置

更新- 我不知道微软为什么选择以这种方式实现这个方法,因为他们说,NEWSEQUENTIALID是Windows UuidCreateSequential函数的包装器。。。但似乎没有非临时变量表方法。至少到目前为止。谢谢大家的评论/回答。[主持人注:]我不确定在无法回答问题时该如何处理问题。因此,我要赞扬@marc_详细介绍了一个解决方法。

现在-newsequentialid只能用作列的默认约束。这也是错误信息非常清楚地说明的

因此,为了获得顺序GUID,您必须有一个表。没有其他方法可以做到这一点。在SQLServer2012中也没有其他方法

我不知道为什么会有这样的差异,也不知道为什么微软会选择这种方式来实现它

更新:

好的,那么您需要获取插入到表中的值-使用如何

比如:

DECLARE @NewIDs TABLE (NewSeqID UNIQUEIDENTIFIER)

INSERT INTO dbo.YourTable(list-of-columns)
OUTPUT INSERTED.NewSeqID INTO @NewIDs(NewSeqID)
VALUES (.........)
这样,INSERT操作的输出——新创建的顺序GUID——被存储到该表变量中,您可以使用它,返回它,切片它——无论您喜欢什么

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

因此,为了获得顺序GUID,您必须有一个表。没有其他方法可以做到这一点。在SQLServer2012中也没有其他方法

我不知道为什么会有这样的差异,也不知道为什么微软会选择这种方式来实现它

更新:

好的,那么您需要获取插入到表中的值-使用如何

比如:

DECLARE @NewIDs TABLE (NewSeqID UNIQUEIDENTIFIER)

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

这样,INSERT操作的输出——新创建的顺序GUID——被存储到该表变量中,您可以使用它,返回它,切片它——无论您喜欢什么

微软的官方说法是:

NEWSEQUENTIALID只能与表上的默认约束一起使用 uniqueidentifier类型的列。例如:创建表myTable ColumnA唯一标识符默认NEWSEQUENTIALID

这里描述


NewID生成一个随机数,另一个是下一个序列号。

微软的官方说法是:

NEWSEQUENTIALID只能与表上的默认约束一起使用 uniqueidentifier类型的列。例如:创建表myTable ColumnA唯一标识符默认NEWSEQUENTIALID

这里描述


NewID生成一个随机数,另一个是下一个序列号。

答案是否定的。你能解释一下你想做什么吗?也许有更好的解决方案。我需要将存储过程中新记录创建的guid返回给调用程序。答案是“否”。你能解释一下你想做什么吗?也许有更好的解决方案。我需要将存储过程中新记录创建的guid返回给调用程序。newsequentialid在表定义中用于列的默认值。我需要将存储过程中新记录创建的guid返回给调用程序。newsequentialid在表定义中用于列的默认值。我需要将存储过程中新记录创建的guid返回给调用程序。