【问题标题】:How to get the dynamic values in SQL for while loop?如何在 SQL for while 循环中获取动态值?
【发布时间】:2019-10-26 01:58:22
【问题描述】:

在我的场景中,我想在 SQL 中循环查询并需要更新详细信息。我有一个名为employees 的员工表,每个员工都有empID 作为主键。我想从将empID 作为外键的empAddress 表中获取每个员工的地址信息。我想将 ThumbID 值更新为 newID() 给每个员工。我怎样才能使用 sql 做到这一点?我已经尝试过使用 while 循环,但不知道如何获取 empID 来更新地址信息。我已经添加了我尝试过的示例代码。

Select * from employees

declare @emp_id int,@i int,@dataCount int;

set @dataCount = @@ROWCOUNT
Set @i = 1

WHILE @dataCount >= @i
BEGIN
    print @i
    select @emp_id = empId from employees
    Update empAddress set thumbID = newID() where empId = @emp_id
    Set @i = @i+1 
END ;

请指导我如何在 SQL 代码中将 @emp_id 值作为动态值?我没有超强的 SQL 知识。提前致谢!

【问题讨论】:

  • 为什么要使用WHILE 循环? UPDATE empAddress SET thumbID = NEWID(); 有什么问题?该查询无论如何都会更新每一行,那么为什么要通过痛苦的行来行呢?
  • 样本数据和期望的结果真的很有帮助。例如,您是否希望同一员工的所有地址都获得相同的thumbId
  • SQL 是一种基于集合的语言。为什么是 while 循环?
  • @Larnu 这里我提到了功能代码的特定部分。实际上我们不需要'WHILE''来进行正常更新。
  • @GordonLinoff 不,employeethumbId 会有所不同。员工的价值不一样。

标签: sql sql-server while-loop ssms


【解决方案1】:

您只想更新所有对应员工记录的 empAddress 记录,对吗?你不应该需要一个循环:

UPDATE empAddress SET thumbID = NEWID()
FROM empAddress 
INNER JOIN employees ON employees.empID = empAddress.empID

或者,假设每个 empAddress 都有一个 empID,那么:

UPDATE empAddress SET thumbID = NEWID()

在 SQL 中执行此操作的循环方式是使用游标,但请注意有多少人对我大喊大叫,甚至提到存在游标。 (它们效率低下,但很好了解,IMO。)这是一个示例,可让您为每个员工 ID 调用 NEWID() 一次,因此同一员工的所有地址都获得相同的唯一标识符:

DECLARE cur CURSOR FOR   
SELECT empID, NEWID() FROM employees

DECLARE @currentEmpID INT
DECLARE @currentNewID UNIQUEIDENTIFIER

OPEN cur  

FETCH NEXT FROM cur   
INTO @currentEmpID, @currentNewID

WHILE @@FETCH_STATUS = 0  
BEGIN       
    UPDATE empAddress 
    SET thumbID = @currentNewID
    WHERE empID = @currentEmpID

    FETCH NEXT FROM cur   
    INTO @currentEmpID, @currentNewID
END   
CLOSE cur;  
DEALLOCATE cur; 

empID   thumbID
1       FF358006-C41E-4632-BEB2-DF95E424B8CB
1       FF358006-C41E-4632-BEB2-DF95E424B8CB
2       DD19753C-1B4B-4D84-89F1-562DB4406A0F
2       DD19753C-1B4B-4D84-89F1-562DB4406A0F

【讨论】:

  • 以上答案对我有很大帮助。非常感谢 Max Szczurek。我在while 循环中有动态值。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 2021-12-15
  • 2015-12-26
  • 2021-12-25
  • 2020-03-01
  • 2014-02-15
  • 1970-01-01
  • 2018-10-07
相关资源
最近更新 更多