动态游标
目前,UDB-TDS 无法识别在存储过程或函数中动态定义的游标。解决方法是使用临时表重写游标。
设置代码:
DROP TABLE IF EXISTS my_table
GO
CREATE TABLE my_table (c1 int, c2 varchar(64), c3 tinyint, c4 money, c5 datetime)
GO
在 SQL Server 中编译和工作的过程,但不是 UDB-TDS:
DROP PROC IF EXISTS sp_cur_test
GO
CREATE PROC sp_cur_test (@TableName varchar(100))
AS
DECLARE @exec_str VARCHAR(4000);
DECLARE @table_schema VARCHAR(100), @table_name VARCHAR(100), @column_name VARCHAR(100);
SELECT @exec_str = 'DECLARE fetch_cursor
CURSOR FOR SELECT table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = ''' + @TableName + '''';
EXEC(@exec_str);
OPEN fetch_cursor;
FETCH fetch_cursor INTO @table_schema, @table_name, @column_name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @table_schema;
PRINT @table_name;
PRINT @column_name;
FETCH fetch_cursor INTO @table_schema, @table_name, @column_name;
END;
CLOSE fetch_cursor;
DEALLOCATE fetch_cursor;
GO
execute sp_cur_test 'MY_TABLE';
GO
在 SQL Server 或 UDB-TDS 中使用临时表重写游标后的过程:
DROP PROC IF EXISTS sp_cur_test;
GO
CREATE PROC sp_cur_test (@TableName varchar(100))
AS
DECLARE @exec_str VARCHAR(4000);
DECLARE @table_schema VARCHAR(100), @table_name VARCHAR(100), @column_name VARCHAR(100);
CREATE TABLE #temp_cur (table_schema VARCHAR(100), table_name VARCHAR(100), column_name
VARCHAR(100));
SELECT @exec_str = 'INSERT INTO #temp_cur
SELECT table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE lower(table_name) = LOWER(''' + @TableName + ''')';
EXEC(@exec_str);
DECLARE fetch_cursor CURSOR FOR SELECT * FROM #temp_cur;
OPEN fetch_cursor;
FETCH fetch_cursor INTO @table_schema, @table_name, @column_name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @table_schema;
PRINT @table_name;
PRINT @column_name;
FETCH fetch_cursor INTO @table_schema, @table_name, @column_name;
END;
CLOSE fetch_cursor;
DEALLOCATE fetch_cursor;
GO
execute sp_cur_test 'MY_TABLE';
GO