Как повторно использовать результат выбора в ПРОЦЕДУРЕ СЕРВЕРА SQL - PullRequest
2 голосов
/ 09 ноября 2010

Например, приведенный ниже код, стрелка, указывающая на две части, может ли вторая использовать результат первой, вместо повторного запроса к базе данных?

CREATE PROCEDURE GetInforEntries (@Count as int) AS
BEGIN   
    SELECT TOP (@Count) *
      from Table_Entries 
     where Retrived IS NULL              <----                      

    IF @@ROWCOUNT > 0
    BEGIN

      UPDATE Table_Entries 
         SET Retrived = CURRENT_TIMESTAMP
       WHERE id IN (SELECT TOP (@Count) id <----
                      from Table_Entries 
                     where Retrived IS NULL)     

    END
END

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

Используйте CTE в операторе UPDATE:

WITH sample AS (
  SELECT TOP(@count)
         te.*
    FROM TABLE_ENTRIES te
   WHERE te.retrieved IS NULL)
UPDATE sample
   SET retrieved = CURRENT_TIMESTAMP

Нет необходимости проверять @@ ROWCOUNT / etc - если нет строк, совпадающих с TABLE_ENTRIES.retrieved, то в запросе обновлять нечего.

Документация

1 голос
/ 09 ноября 2010

Вы можете объявить переменную таблицы или создать временную таблицу для хранения результатов первого запроса.

DECLARE @MyTempTable (column-list)

INSERT INTO @MyTempTable (column-list...)
SELECT TOP(@Count) *
FROM Table_Entries
WHERE Retrieved IS NULL

-- display results of first query
SELECT *
FROM @MyTempTable

IF @@ROWCOUNT > 0
BEGIN

  UPDATE Table_Entries 
     SET Retrived = CURRENT_TIMESTAMP
   WHERE id IN (SELECT id <----
                  from @MyTempTable)     

Это будет полезно только в том случае, если вы хотите отобразить результаты первого запроса и есликоличество строк, возвращаемых в первом запросе, повышает производительность обновления.

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