Как получить динамические значения в SQL для цикла while? - PullRequest
0 голосов
/ 11 июня 2019

В моем сценарии я хочу зациклить запрос в SQL, и мне необходимо обновить детали.У меня есть таблица сотрудников с именем employees, и каждый сотрудник имеет empID в качестве первичного ключа.Я хочу получить информацию об адресе каждого сотрудника из таблицы empAddress, в которой empID является внешним ключом.Я хочу обновить значение 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 ;

Пожалуйста, объясните мне, как я могу получить значение @emp_id как динамическое в коде SQL?У меня нет супер знаний в SQL.Заранее спасибо!

1 Ответ

1 голос
/ 11 июня 2019

Вы просто хотите обновить все записи 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.) Вот пример, который позволяет вам вызывать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...