Инструкция SQL — Update в файле, зависящем от процедуры, заполняется только при втором запуске процедуры

#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]