#sql #sql-server
#sql #sql-сервер
Вопрос:
Вот моя процедура обновления:
UPDATE tbl1 SET -- other columns tbl1.field_1 = CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104)), tbl1.field_2 = DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, tbl1.field_1), -- other columns FROM [db1].[cars].[table_1] AS tbl1 INNER JOIN [db2].[cars].[carsAll_test] AS carsAll ON tbl1.[TP_PK]=carsAll.[TP_PK]
При первом запуске процедуры все столбцы заполняются данными, кроме tbl1.field_2
.
Во второй раз, когда я бегу, он tbl1.field_2
тоже заполняется.
Как обновить все столбцы за один запуск и почему это происходит, если tbl1.field_1
задано до начала процедуры tbl1.field_2
?
Я использую SQL Server 2017 (v14).
Комментарии:
1. Вы пробовали вычислить новое значение field_1 во внешнем приложении, чтобы ссылаться на него в выражении field_2? Значение tbl1.field_1, на которое вы ссылаетесь в данный момент, является предыдущим/сохраненным значением.
Ответ №1:
почему это происходит, когда tbl1.field_1 задан до начала процедуры с tbl1.field_2
Поле в правой части вашего запроса ( tbl1.field_1
) будет ссылаться на его исходное значение(до обновления), независимо от того, в каком порядке они находятся.
Проще говоря, обновленное значение для tbl1.field_1
будет доступно только после завершения всего оператора обновления. Таким образом, вы не можете использовать эту строку в этом же заявлении об обновлении tbl1.field_2 = DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, tbl1.field_1),
Как обновить все столбцы за один запуск
Вместо ссылок tbl1.field_1
вы можете напрямую ссылаться carsAll.DateOfBirth
UPDATE tbl1 SET -- other columns tbl1.field_1 = CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104)), tbl1.field_2 = DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, carsAll.DateOfBirth), -- other columns FROM [db1].[cars].[table_1] AS tbl1 INNER JOIN [db2].[cars].[carsAll_test] AS carsAll ON tbl1.[TP_PK]=carsAll.[TP_PK]