@@FETCH_STATUS връща -1 при опит за използване на курсор въз основа на заявка на INFORMATION_SCHEMA

Опитвам се да създам 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 и не се извлича ред.

какво правя грешно

Благодаря


person bzamfir    schedule 11.01.2012    source източник
comment
Работи за мен, когато коментирам AND (INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME = N'TargetFieldName'). Сигурни ли сте, че изборът връща редове?   -  person Martin Smith    schedule 11.01.2012


Отговори (2)


Това работи добре за мен. Съмнявам се в твърдението ви, че 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  
person Martin Smith    schedule 11.01.2012

Всъщност открих проблема. Кодът, който публикувах, всъщност беше опростена версия на действителния ми код. Моят реален избор, използван от курсора, избра три полета, както е показано по-долу, но fetch се опита да извлече само две полета.

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

Когато публикувах въпроса, мислех да го опростя, но това всъщност реши проблема :)

Ето защо моето изявление проработи за Мартин, но не и за мен - защото по "грешка" кодът, който публикувах, беше правилен, за разлика от кода, който всъщност използвах.

Благодаря, Мартин, че отдели време да публикуваш отговора си, който най-накрая ме накара да открия проблема.

person bzamfir    schedule 11.01.2012