Будет ли использование и обновление одного и того же поля в одной статистике ОБНОВЛЕНИЯ вызывать неопределенное поведение? - PullRequest
0 голосов
/ 04 апреля 2009

Вот пример

UPDATE duration = datediff(ss, statustime, getdate()), statustime = getdate() where id = 2009

Будет ли поле duration назначено неопределенное назначенное значение, так как statustime используется и присваивается в том же операторе? (т. е. положительное значение, если дата обрабатывается первым, или отрицательное, если время обработки обрабатывается первым)

Я могу определенно обновить его в двух отдельных утверждениях, но мне любопытно, что возможно обновить его в одном утверждении.

Ответы [ 2 ]

5 голосов
/ 04 апреля 2009

Нет. Оба значения рассчитываются до того, как будет выполнено любое присвоение.

Обновление:
Я отследил спецификацию ANSI-92 , и в разделе 13.10 инструкции UPDATE говорится следующее:

The <value expression>s are effectively evaluated for each row of T before updating any row of T.

Единственные другие применимые правила относятся к разделу 9.2, но это касается только одного назначения в отдельности.

Здесь есть некоторая возможность для неоднозначности: он может вычислять и обновлять сначала все строки statustime, а затем все строки duration и технически следовать спецификации, но это будет очень .. ... странно ... способ реализовать это.

1 голос
/ 04 апреля 2009

Мой инстинкт инстинкта говорит «нет», но это будет варьироваться в зависимости от реализации SQL, анализатора запросов и так далее. В таких ситуациях лучше всего провести быстрый эксперимент на вашем сервере (обернуть его в транзакцию, чтобы не допустить изменения данных) и посмотреть, как ведет себя ваша конкретная реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...