Эффективный SQL-запрос для двух обновлений и поисковых запросов - PullRequest
2 голосов
/ 01 февраля 2010

У меня такой запрос:

SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE

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

Но, как вы видите здесь, я дважды искал эту строку. Можно ли как-нибудь запомнить строку и выполнить обновление, не выполняя поиск снова.

Спасибо.

Ответы [ 5 ]

4 голосов
/ 01 февраля 2010

В первом запросе вы получили идентификатор. Во втором запросе используйте это, чтобы найти строку для обновления вместо использования даты:

UPDATE MYTABLE
SET DATA = 'FooBar'
WHERE ID = 200
0 голосов
/ 02 февраля 2010

Я знаю, что это не в моде, но вы также можете делать позиционные обновления курсоров например,

use Northwind
GO



DECLARE EMP_CURSOR CURSOR 
FOR SELECT TOP 1 EmployeeID, LastName FROM EMPLOYEES WHERE  HireDate = '1994-11-15'
FOR UPDATE OF LastName

OPEN EMP_CURSOR

FETCH NEXT FROM EMP_CURSOR 

UPDATE EMPLOYEES
SET LastName = LastName + CAST(DatePart(ms,GetDate()) as char(3))
WHERE CURRENT OF EMP_CURSOR


CLOSE EMP_CURSOR

DEALLOCATE  EMP_CURSOR
0 голосов
/ 01 февраля 2010

Я предполагаю, что столбец DATE не проиндексирован (если нет, то почему нет?). Тогда вам лучше всего убедиться, что вы извлекаете первичный ключ (не так ли?), А затем используете его в качестве состояние в обновлении.

0 голосов
/ 01 февраля 2010

Вы можете объединить UPDATE с SELECT в одну инструкцию, но не для двух транзакций. Поэтому, если вам нужно обновить значение в другой транзакции, чем вы его выбираете (причина этого мне неясна), вам нужно два утверждения.

0 голосов
/ 01 февраля 2010
--Note, need to setup proper data types
DECLARE @Id INT
DECLARE @Data VARCHAR(MAX)
DECLARE @OtherInf VARCHAR(max)

SELECT TOP 1 @id = Id, @Data = Data, @OtherInf = OtherInf
FROM MyTable
WHERE Date = @Date

--Now you can do what you need, using the info above.

Это должно сделать это

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