SQL - В каком порядке обновление таблицы работает, это гарантировано? - PullRequest
0 голосов
/ 21 марта 2012

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

У меня есть запрос, который обновляет таблицу.Обновление зависит от порядка таблицы.

Работают ли операторы обновления SQL прямо через таблицу, строка за строкой?Просматривает ли оператор Update каждую строку непосредственно из таблицы или из «кэшированного выбора» таблицы, сформированной в начале.У меня есть данные такого рода каскадом вниз по таблице, и я не уверен, что они будут работать правильно.

Во-вторых, чтобы сделать это обновление, я использую оператор Update - From, гдеСтол соединяется с другим, потом снова на себя.Будет ли оператор order by упорядочивать данные до того, как произойдет Обновление, или делать что-то еще?

Я использую SQL Server 2008 r2.

ОБНОВЛЕНИЕ: Это отношение к другому вопросу, который яспросил здесь .Обновление работает с данными, которые выглядят следующим образом:

Id1    Id2
-----------
100    50
120    70
70     50
34     20
50     40
40     10

И, в целом, следует обновить информацию с Id1 до Id2, так что вышеизложенное будет производить обновления, которые эффективно обновляют следующие данные, что является уменьшением вышеуказанного:

Id1    Id2
-----------
100    10
120    10
34     20

Я посмотрел на это и предположил: «Эй, если это работает сверху вниз в desc, нет необходимости беспокоиться об этом, так как обновления будут происходить для того, чтобы кто-нибудь и продолжал,Но, очевидно, это не правильно.

1 Ответ

1 голос
/ 21 марта 2012

Если вам нужно обновить в определенном порядке, используйте курсор:

declare myCursor cursor
for select * from myTable1 t1
inner join myTable2 t2 on t1.id = t2.fid
order by t1.id  /* <==== */
for update of t1.col1, t1.col2

open myCursor
fetch next from myCursor /* optional into clause */
while @@fetch_status = 0
begin
    update myCursor set col1 = /* Some expression */, col2 = /* Some expression */
    fetch next from myCursor  /* optional into clause */
end
close myCursor 
deallocate myCursor 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...