Sql server TSQL-将Case语句与动态表一起使用(未知行数)

Sql server TSQL-将Case语句与动态表一起使用(未知行数),sql-server,tsql,stored-procedures,case,Sql Server,Tsql,Stored Procedures,Case,我在尝试创建存储过程时遇到了一些问题。我正在使用Microsoft SQL Server Management Studio 2017和T-SQL。我有两个表,eTasks和eStaff。以下是每个表的列: 埃斯塔夫 StaffID | Name 埃塔克斯 TaskID | StaffID | Title | CreateDate 目前,如数据所示,所有任务都分配给StaffID“1”。eTasks和eStaff表都会使用新任务和人员进行更新,或者将其取出,这些表每天的行数永远不会相同。有时

我在尝试创建存储过程时遇到了一些问题。我正在使用Microsoft SQL Server Management Studio 2017和T-SQL。我有两个表,
eTasks
eStaff
。以下是每个表的列:

埃斯塔夫

StaffID | Name
埃塔克斯

TaskID | StaffID | Title | CreateDate
目前,如数据所示,所有任务都分配给StaffID“1”。eTasks和eStaff表都会使用新任务和人员进行更新,或者将其取出,这些表每天的行数永远不会相同。有时候,eTask表中会有1000行,而下一天可能只有400行。有些时候,eStaff表中会有3名工作人员,接下来可能会有12名

我想做的是在运行存储过程时将任务均匀地分配到当前的staffies中

到目前为止,我的情况如下:

CREATE PROCEDURE UpdatingeTasksTable 
AS 
    DECLARE t_rowCount INTEGER
    DECLARE s_staffIDCount INTEGER

    SET t_rowCount = SELECT COUNT(*) FROM eTasks
    SET s_staffIDCount = SELECT DISTINCT StaffID FROM eStaff

    UPDATE eTasks
    SET StaffID = CASE WHEN TaskID % t_rowCount = 1 
                          THEN 1
                       WHEN TaskID % t_rowCount = 2 
                          THEN 4
                       WHEN TaskID % t_rowCount = 3 
                          THEN 3
                       WHEN TaskID % t_rowCount = 4 
                          THEN 2
                  END 
    FROM eTasks b
    WHERE TaskID = b.TaskID;

我知道,我的查询目前是怎样的,它只会将任务分配给4个人。是否有一种方法可以使
CASE
语句动态化,这样就不只是一组静态数字了?

您应该能够使用
行编号()来实现这一点:


我们可以使用
NTILE
来计算动态员工人数,如:

ALTER PROCEDURE UpdatingeTasksTable 
AS 
BEGIN 
 DECLARE @t_rowCount INT;
 select @t_rowCount = COUNT(*) from eStaff;

 WITH CTE AS(
  select TaskID, 
   NTILE(@t_rowCount) OVER (ORDER BY TaskID) AS NTILE, 
   StaffID, Title, 
   CreateDate 
 FROM eTasks)
 UPDATE CTE
  SET CTE.StaffID=CTE.NTILE

END
执行SP

EXEC UpdatingeTasksTable
检查结果

select * from eTasks

CASE
在这个问题上不起作用。您必须循环检查每个员工id,然后为该员工id更新有限数量的任务(基于任务/员工数量)。您可以使用NTILE吗?我不确定您的目标是什么。你能发布一些示例数据(如DDL+DML)和期望的结果吗。T-SQL中的变量如下所示:
@Variable
。2. <代码>从eTasks中选择计数(*)
基本正确。3.
SET s_staffIDCount=从eStaff中选择不同的StaffID
绝对不正确。不能用一组值加载标量变量。您在前一行中的想法是正确的,应该是
SELECT@s_staffIDCount=COUNT(*)StaffID FROM eStaff
select * from eTasks