Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL while循环以根据名称查找下一行_Sql_Sql Server 2008 R2_While Loop_Case - Fatal编程技术网

SQL while循环以根据名称查找下一行

SQL while循环以根据名称查找下一行,sql,sql-server-2008-r2,while-loop,case,Sql,Sql Server 2008 R2,While Loop,Case,我有一个SQL触发器,每当新客户签入时,他们都会自动分配给技术人员。我有一个很好的案例说明 SET @TechOrder = ( CASE WHEN @LastTech = 'Tech1' THEN 'Tech2' WHEN @LastTech = 'Tech2' THEN 'Tech3' WHEN @LastTech = 'Tech3' THEN 'Tech4' WHEN @LastTech = 'Tech4' THEN

我有一个SQL触发器,每当新客户签入时,他们都会自动分配给技术人员。我有一个很好的案例说明

SET @TechOrder = 
(
    CASE
        WHEN @LastTech = 'Tech1' THEN 'Tech2'
        WHEN @LastTech = 'Tech2' THEN 'Tech3'
        WHEN @LastTech = 'Tech3' THEN 'Tech4'
        WHEN @LastTech = 'Tech4' THEN 'Tech1'
        and so on...
        ELSE 'Tech1'
    END
)   
UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
然后,它用以下命令更新插入的订单

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
这个职位有很多工作表的变化,我不想每次有新技术时都手动更改SQL触发器。我想知道是否有更好的方法根据员工表分配技术,其中工作表等于这个职位

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
我在想一个循环或者光标可以用来选择下一个技术,但是我不确定我会怎么做。我使用的是SQL 2008 R2,因此使用滞后/超前将不起作用

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID

如果有任何帮助,我们将不胜感激。

您如何创建一个包含技术和上次分配工作顺序日期的表格,如下所示:下面的表格和命令只是想法,不要遵循语法

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
techTable (
   id        autoincrement value,
   techName  varchar value,
   lastAssign datetime value DEFAULT now() --to the case you 
                                           --insert a new tech      
);
然后你从MIN date中选择它,因为它必须是最后一个在修井单上工作的人。我在评论中说了max,但按照工作顺序应该是MIN

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
select top 1 id, techName, min(lastAssign)
  from techTable 
 group by id, techName;
然后选择它,用新的日期更新它

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
update techTable set lastAssign = now() where id = idFromTheAboveQuery;
然后,该技术人员将处于下一个训练顺序的最后位置

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
考虑

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
如果你想改进你的项目,考虑一下:

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID
你想知道技术人员的历史记录吗?在techTable上放置一个字段,以确定某项技术是活动的还是非活动的,并在您的选择栏中筛选活动的技术

UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID

你的技术人员轮班工作吗?您可以创建一个新的表shiftsid、starttime、endtime,并在techTable上放置一个FK,也可以是多对多关系。这取决于你。或者只需将另外两个字段放在techTable startWork和endWork以及select you filter上,此时startWork和endWork之间的位置

如何使用techs和上次分配工作顺序的日期创建一个表格,然后从max date中选择它,选择后用新日期更新它。这是一个非常好的主意,我会调查一下,如果它解决了你的问题,让我知道,然后我会发布一个答案,这样它可以帮助其他人找到你的帖子。会做的,我现在正在尝试,谢谢。我成功了,唯一的问题是当新员工加入时,他们的指定日期为空,所以maxdate看不到它。我所做的是在表上设置一个默认约束,以便在添加员工时设置getdate。再次感谢你的帮助。
UPDATE WorkOrder
SET Technician = @TechOrder
WHERE ID = @OrderID