Выберите строки и обновить те же строки для блокировки? - PullRequest
2 голосов
/ 23 июля 2010

Мне нужно написать процедуру, которая позволит мне выбрать x количество строк и в то же время обновить эти строки, чтобы вызывающее приложение узнало, что эти записи заблокированы и используются. У меня есть столбец в таблице с именем «заблокирован». При следующем вызове процедуры будет извлечено только следующее количество записей, для которых не установлен флажок «заблокирован». Я немного прочитал о методе OUTPUT для SQL-сервера, но не уверен, что это то, что я хочу сделать.

Ответы [ 2 ]

7 голосов
/ 23 июля 2010

Как вы предложили, вы можете эффективно использовать предложение OUTPUT:

Демонстрация в реальном времени: https://data.stackexchange.com/stackoverflow/query/8058/so3319842

UPDATE #tbl
SET locked = 1
OUTPUT INSERTED.*
WHERE id IN (
    SELECT TOP 1 id
    FROM #tbl
    WHERE locked = 0
    ORDER BY id
)​

См. Также эту статью:

http://www.sqlmag.com/article/tsql3/more-top-troubles-using-top-with-insert-update-and-delete.aspx

3 голосов
/ 23 июля 2010

Проголосуйте за ответ Cade Roux, используя OUTPUT:

UPDATE #tbl
   SET locked = 1
OUTPUT INSERTED.*
 WHERE id IN (SELECT TOP 1 id
                FROM #tbl
               WHERE locked = 0
            ORDER BY id)​

Ранее:


Это один из немногих случаев, когда я могу использовать временную таблицу:

ALTER PROCEDURE temp_table_test
AS
BEGIN

   SELECT TOP 5000 * 
     INTO #temp_test
     FROM your_table
    WHERE locked != 1
 ORDER BY ?

   UPDATE your_table
      SET locked = 1
    WHERE id IN (SELECT id FROM #temp_test)

   SELECT *
     FROM #temp_test

   IF EXISTS (SELECT NULL
                FROM tempdb.dbo.sysobjects
               WHERE ID = OBJECT_ID(N'tempdb..#temp_test'))
   BEGIN
     DROP TABLE #temp_test
   END

END

Это:

  1. Извлекает нужные вам строки, помещает их в локальную временную таблицу
  2. Использует временную таблицу для обновления строк, которые будут «заблокированы»
  3. ВЫБИРАЕТ из временной таблицы, чтобы дать вам свой вывод результатов
  4. Удаляет временную таблицу, потому что они живут для сеанса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...