sys.databases в курсоре пропуская базы данных - PullRequest
2 голосов
/ 30 марта 2012

Я видел немного производственного кода, который выглядит так, как будто он должен быть в порядке, и работает 80% времени, но остальные 20% перестанут возвращаться и перебирать список баз данных без видимой причины:

DECLARE c_UserDatabases CURSOR FOR
  SELECT Name
  FROM   Sys.Databases SD (NOLOCK)
  ORDER  BY Name

OPEN c_UserDatabases
FETCH Next FROM c_UserDatabases INTO @v_DatabaseName
WHILE @@FETCH_STATUS = 0
  BEGIN
      -- Query that takes a few minutes to run (using dynamic SQL and EXEC, etc)
      FETCH Next FROM c_UserDatabases INTO @v_DatabaseName
  END

CLOSE c_UserDatabases
DEALLOCATE c_UserDatabases 

Это на SQL Server 2008 с пакетом обновления 3 (SP3).Я заметил статьи, в которых упоминалось, что в некоторых версиях было неправильно, если вы не заказывали по имени, но ничего не указывало на это условие сбоя.Я думаю, что мы можем оказаться в редкой ситуации, потому что внутренний раздел может занять так много времени?

Я хотел бы знать, видел ли кто-нибудь еще это.Я планирую переписать его, чтобы выбрать во временную таблицу и вместо этого навести курсор на него.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2014

Это действительно мой старый вопрос, но ответ был таков: если вы перебираете базы данных Sys.Data, ваш тип курсора должен быть STATIC.т.е. резервные копии и т. д.) он может пропустить базу данных.То же самое с sp_MSForeachDB.

К счастью, мы давно прошли этот бит.И да, НОЛОКА забрали.

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

Несмотря на то, что sp_MSForeachDB недокументирован, он предоставляет хороший способ выполнения запросов ко всем БД.Поможет ли этот подход?

EXEC sp_MSForeachDB '
    SELECT * FROM [?].sys.tables
'
...