Sql 是否将表变量中的值分配给表的每一行?

Sql 是否将表变量中的值分配给表的每一行?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表(参考表),它将保存唯一的值(uniqueidentifer类型)。 我有200万用户,我需要为这个参考表中的每个用户生成一个唯一的值。 在创建它们时,我希望捕获这些唯一值,并将它们分配给另一个表(称为用户表)中的每个用户 下面是我的尝试:我创建了一个名为@ReferenceId的表变量。如何获取@ReferenceId并将每个唯一值分配给用户表中的一个单独行 create procedure create_reference_ids @numberOfNewAccounts

我有一个表(参考表),它将保存唯一的值(uniqueidentifer类型)。 我有200万用户,我需要为这个参考表中的每个用户生成一个唯一的值。 在创建它们时,我希望捕获这些唯一值,并将它们分配给另一个表(称为用户表)中的每个用户

下面是我的尝试:我创建了一个名为@ReferenceId的表变量。如何获取@ReferenceId并将每个唯一值分配给用户表中的一个单独行

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;

你的代码有什么问题吗?请阅读一些关于改进问题的提示。