Sql server TSQL-将Case语句与动态表一起使用(未知行数)
我在尝试创建存储过程时遇到了一些问题。我正在使用Microsoft SQL Server Management Studio 2017和T-SQL。我有两个表,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表都会使用新任务和人员进行更新,或者将其取出,这些表每天的行数永远不会相同。有时
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