我尝试创建一个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并且没有检索到行。
我做错了什么?
谢谢
答案 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,但不适合我 - 因为“错误”我发布的代码是正确的,不像我实际使用的代码。
谢谢,马丁,花时间发布你的答案,最终让我发现了问题。