当尝试根据INFORMATION_SCHEMA上的查询使用游标时,@@ FETCH_STATUS返回-1

时间:2012-01-11 13:38:37

标签: tsql cursor fetch

我尝试创建一个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 个答案:

答案 0 :(得分:1)

这对我来说很好。我怀疑你断言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  

答案 1 :(得分:0)

其实我发现了这个问题。 我发布的代码实际上是我实际代码的简化版本。光标使用的实际选择选择了三个字段,如下所示,但fetch尝试仅获取两个字段。

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

当我发布问题时,我想简化它,但这确实解决了问题:)

这就是为什么我的陈述适用于Martin,但不适合我 - 因为“错误”我发布的代码是正确的,不像我实际使用的代码。

谢谢,马丁,花时间发布你的答案,最终让我发现了问题。