为列中的每一行生成全局唯一标识符(GUID)

9

我有一个带有一列的表的存储过程,我需要为该列中的每一行生成一个NEWID()。 我只能通过循环来完成吗?

+---+    +--------------------------------------+---+
| a |    | FD16A8B5-DBE6-46AB-A59A-6B6674E9A78D | a |
| b | => | 9E4A6EE6-1C95-4C7F-A666-F88B32D24B59 | b |
| c |    | 468C0B23-5A7E-404E-A9CB-F624BDA476DA | c |
+---+    +--------------------------------------+---+

1
循环并非必要的,一般情况下应该尽量避免在SQL Server中使用循环,而是使用基于集合的操作(如@bluefeet所示的被接受的答案)。 - alroc
这个回答解决了你的问题吗?如何在存储过程中生成新的Guid? - KyleMit
3个回答

11

您应该能够从表格中选择并包括newid()来为每一行生成值:

select newid(), col
from yourtable;

请见带演示的 SQL Fiddle


如果我需要在同一查询中访问由newid()创建的值怎么办? - user471849
1
@Joe 我的建议是您提出一个新问题,陈述您的新要求。 - Taryn

8

0

newid()肯定可以工作。但也会创建“碎片化”的值。

这可能对您的需求有益或有害(将guid视为主键)。

这是我一段时间前编写的一个过程,用于“有点帮助”解决碎片化问题。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspNewSequentialUUIDCreateSingle]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[uspNewSequentialUUIDCreateSingle]
GO

/*

--START TEST

declare @returnCode int
declare @ReturnUUID uniqueidentifier

EXEC @returnCode = dbo.uspNewSequentialUUIDCreateSingle @ReturnUUID output
print @ReturnUUID
print '/@returnCode/'
print @returnCode


--loop test,,,loop exists for TESTING only fyi

declare @counter int
select @counter = 1000

while @counter > 0
    begin
        EXEC @returnCode = dbo.uspNewSequentialUUIDCreateSingle @ReturnUUID output
        print @ReturnUUID
        select @counter = @counter - 1
    end


--END TEST CODE


*/

CREATE PROCEDURE [dbo].[uspNewSequentialUUIDCreateSingle] (
@ReturnUUID uniqueidentifier output  --return
)

AS


--//You can use NEWSEQUENTIALID() to generate GUIDs to reduce page contention at the leaf level of indexes.

SET NOCOUNT ON 

--      declare @ReturnUUID uniqueidentifier

declare @t table ( id int , uuid uniqueidentifier default newsequentialid() )
insert into @t ( id ) values (0)
select @ReturnUUID = uuid from @t



SET NOCOUNT OFF
GO

GRANT EXECUTE ON dbo.uspNewSequentialUUIDCreateSingle TO public

GO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接