2013-07-24 6 views
2

У меня есть хранимая процедура, в которой есть таблица с одним столбцом, и мне нужно создать NEWID() для каждой строки в этом столбце. Смогу ли я выполнить это с помощью цикла?генерировать guid для каждой строки в столбце

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

Да, вы бы это сделали. –

+1

Цикл не нужен, и, вообще говоря, вы должны попытаться избежать циклов в SQL Server, вместо этого использовать операции с набором (как показано в принятом ответе от @bluefeet). – alroc

ответ

6

Вы должны быть в состоянии выбрать из таблицы и включают newid() для создания значения для каждой строки:

select newid(), col 
from yourtable; 

См SQL Fiddle with Demo

+0

Что делать, если мне нужен доступ к значению, созданному newid() где-то внутри одного и того же запроса? –

+0

@Joe Мое предложение было бы опубликовать новый вопрос с вашими новыми требованиями. – Taryn

0

новый() определенно работа. Но также создаст «фрагментированные» значения.

Это может быть полезно или вредно (подумайте, что это главный ключ), в соответствии с вашими потребностями.

Вот процедура, которую я написал некоторое время назад, чтобы «получить помощь» с фрагментацией.

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 
Смежные вопросы