table 中的随机数待更新

Random number from table to be updated

我有一个 table,其中包含 EmployeeID、EmployeeName、EmployeeDeptID。我正在尝试为此 table 输入一些示例数据。 我收到了带有 EmployeeID 和 EmployeeName 的文本文件,并将其加载到 Employee table.

我被告知 EmployeeDeptID 的值为 2010,2590,2877 和 null。我被要求将 EmployeeDeptID 随机分配给 Employees。我不知道该怎么做

这是我试过的。

Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT)

我用 'import data' 加载到 dbo.Employee。

我又创建了一个table

Create table temp.SampleEmployeeDeptID(EmployeeDeptID int)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(null)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2010)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2590)
insert into temp.SampleEmployeeDeptID(EmployeeDeptID)values(2877)

我知道我必须使用这个 SELECT TOP 1 * FROM temp.SampleEmployeeDeptID ORDER BY newid() 获取随机 EmployeeID 但不知道如何在 Update 语句中使用它。

感谢任何帮助。还有其他更简单的方法吗?

使用 ORDER BY Rand() 从 temp.SampleEmployeeDeptID 中提取一个随机的 EmployeeDeptID,然后使用游标遍历 dbo.Employee 的每一行以设置新值。

DECLARE @EmployeeID as INT;
DECLARE @EmployeeCursor as CURSOR;

SET @EmployeeCursor = CURSOR FOR
SELECT EmployeeID From dbo.Employee

OPEN @EmployeeCursor;
   FETCH NEXT FROM @EmployeeCursor INTO @EmployeeID;
   WHILE @@FETCH_STATUS = 0
      BEGIN
         SET Employee.EmployeeDeptID = (Select TOP 1 * from temp.SampleEmployeeDeptID Order By Rand()) Where EmployeeID = @EmployeeID
END

这是您可以尝试的一种可能的解决方案,我模拟了您的示例 table:

我生成了一个随机 ID 值列表和一个代理键,然后可以将其连接到现有 table,再次使用代理 ID,然后可以使用 CTE 对其进行更新:

/* Sample data*/
Create Table dbo.Employee(EmployeeID INT,EmployeeName VARCHAR(100), EmployeeDeptID INT);
insert into Employee select 1,'Person 1', null;
insert into Employee select 2,'Person 2', null;
insert into Employee select 3,'Person 3', null;
insert into Employee select 4,'Person 4', null;


with v as (
    select v, Row_Number() over(order by NewId()) Id
    from (values(2010),(2590),(2877),(null))x(v)
), e as (
    select *, Row_Number() over (order by EmployeeId) Id
    from Employee
), u as (
    select e.EmployeeDeptID, v.v 
    from v join e on e.Id = v.Id
)
update u set employeeDeptId = v;

/* Test result */
select * from Employee;

查看工作Demo FIddle