Sql 是否将表变量中的值分配给表的每一行?
我有一个表(参考表),它将保存唯一的值(uniqueidentifer类型)。 我有200万用户,我需要为这个参考表中的每个用户生成一个唯一的值。 在创建它们时,我希望捕获这些唯一值,并将它们分配给另一个表(称为用户表)中的每个用户 下面是我的尝试:我创建了一个名为@ReferenceId的表变量。如何获取@ReferenceId并将每个唯一值分配给用户表中的一个单独行Sql 是否将表变量中的值分配给表的每一行?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表(参考表),它将保存唯一的值(uniqueidentifer类型)。 我有200万用户,我需要为这个参考表中的每个用户生成一个唯一的值。 在创建它们时,我希望捕获这些唯一值,并将它们分配给另一个表(称为用户表)中的每个用户 下面是我的尝试:我创建了一个名为@ReferenceId的表变量。如何获取@ReferenceId并将每个唯一值分配给用户表中的一个单独行 create procedure create_reference_ids @numberOfNewAccounts
create procedure create_reference_ids
@numberOfNewAccounts int
DECLARE @ReferenceIds TABLE (Id uniqueidentifier)
set @numberOfNewAccounts = 2000000
as
begin
while @numberOfNewAccounts > 0
begin
insert into Reference (0,0,@UtcNow,@UtcNow)
OUTPUT Inserted.Id INTO @ReferenceIds
set @numberOfNewAccounts = @numberOfNewAccounts - 1
end
end
exec create_reference_ids
使用
merge
语句插入有用户时引用值的确切数目,并将新ID输出到一个表变量中,该变量将新引用ID链接到现有用户ID。然后在用户表上执行更新
DECLARE @NewId TABLE (UserId int, ReferenceId int);
-- Using Merge for insert is the only way to get values from columns in the output table which don't exist in the Target table
MERGE INTO dbo.Reference AS Target
USING dbo.[User] AS Source
ON 1 = 0 -- Force an insert regardless
WHEN NOT MATCHED THEN
-- Best practice is to always explicitly name your columns
INSERT (Col1, Col2, Col3, Col4)
VALUES (0, 0, @UtcNow, @UtcNow)
OUTPUT Source.Id, Inserted.Id
INTO @NewId (UserId, ReferenceId);
UPDATE U SET
ReferenceId = I.ReferenceId
FROM dbo.[User] U
INNER JOIN @NewId I on I.UserId = U.Id;
你的代码有什么问题吗?请阅读一些关于改进问题的提示。