@@ FETCH_STATUS возвращает -1 при попытке использовать курсор на основе запроса на INFORMATION_SCHEMA - PullRequest
0 голосов
/ 11 января 2012

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

Поэтому я планировал создать курсор для получения всех этих таблиц, а затем подготовить динамический sql для обработки.

У меня есть следующий код

declare schema_cursor cursor
for
SELECT     INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA, INFORMATION_SCHEMA.TABLES.TABLE_NAME
FROM         INFORMATION_SCHEMA.TABLES INNER JOIN
                  INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA = INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA AND 
                  INFORMATION_SCHEMA.TABLES.TABLE_NAME = INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
WHERE     (INFORMATION_SCHEMA.TABLES.TABLE_TYPE = 'BASE TABLE') AND (INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = N'TargetFieldName')

open schema_cursor
fetch next from schema_cursor into @schema, @table
while (@@FETCH_STATUS=0)
begin

Если я запускаю запрос для курсора напрямую, я получаю все имена таблиц, которые мне нужны. Но когда я запускаю код выше, @@ FETCH_STATUS возвращает -1, и нетстрока извлечена.

Что я делаю не так?

Спасибо

Ответы [ 2 ]

1 голос
/ 11 января 2012

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

SET NOCOUNT ON

DECLARE @schema SYSNAME,
        @table  SYSNAME
DECLARE schema_cursor CURSOR FOR
  SELECT INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA,
         INFORMATION_SCHEMA.TABLES.TABLE_NAME
  FROM   INFORMATION_SCHEMA.TABLES
         INNER JOIN INFORMATION_SCHEMA.COLUMNS
           ON INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA =
              INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA
              AND INFORMATION_SCHEMA.TABLES.TABLE_NAME =
                  INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
  WHERE  ( INFORMATION_SCHEMA.TABLES.TABLE_TYPE = 'BASE TABLE' ) 
  --AND (INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = N'TargetFieldName')
OPEN schema_cursor

FETCH NEXT FROM schema_cursor INTO @schema, @table

WHILE ( @@FETCH_STATUS = 0 )
  BEGIN
      RAISERROR('%s %s', 0, 1, @schema, @table)

      FETCH NEXT FROM schema_cursor INTO @schema, @table
  END

CLOSE schema_cursor

DEALLOCATE schema_cursor  
0 голосов
/ 11 января 2012

На самом деле я нашел проблему.Код, который я разместил, был на самом деле упрощенной версией моего настоящего кода.Мое реальное выделение, используемое курсором, выбрало три поля, как показано ниже, но fetch попытался получить только два поля.

SELECT 
     INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA,
     INFORMATION_SCHEMA.TABLES.TABLE_NAME,
     INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME
-- ....

Когда я отправил вопрос, я подумал упростить его, но это фактически решило проблему:)

Вот почему мое утверждение сработало для Мартина, но не для меня - потому что «ошибочно» опубликованный мною код был правильным, в отличие от кода, который я на самом деле использовал.

Спасибо, Мартинза то, что нашли время опубликовать свой ответ, который наконец привел меня к обнаружению проблемы.

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