谁能告诉我如何在 SQL Server 中动态声明游标名称(固定名称+唯一名称)?
这是为了防止错误
02-25-2018 10:12:01 错误(AdHocReportserviceImpl.java:882):org.springframework.jdbc.UncategorizedSQLException:CallableStatementCallback; SQL 的未分类 SQLException [{call usp_AdHocReport(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}];
SQL状态[34000];错误代码[16916]; [FMWGEN][SQLServer JDBC 驱动程序][SQLServer]名称为“FetchRegion”的游标不存在。嵌套异常是 java.sql.SQLException: [FMWGEN][SQLServer JDBC Driver][SQLServer]名称为“FetchRegion”的游标不存在
从多线程java应用程序访问它时。我尝试在
LOCAL
声明后添加 CURSOR
但不起作用。
DECLARE FetchRegion CURSOR READ_ONLY FOR
SELECT ......
OPEN FetchRegion
FETCH NEXT FROM FetchRegion INTO @RGN
WHILE @@ROWCOUNT <> 0
BEGIN
.....
FETCH NEXT FROM FetchRegion INTO @RGN
END
CLOSE FetchRegion
DEALLOCATE FetchRegion
您可以使用此示例,我使用系统表来获取前 10 行,但您可以创建自己的游标。
声明 @cursor_name AS NVARCHAR(100)
SET @cursor_name = 'sampleCursor'
+ Replace(Cast(Newid() AS VARCHAR(36)), '-', '')
DECLARE @cursor_sql AS NVARCHAR(max)
SET @cursor_sql = N' DECLARE @name nvarchar(10) DECLARE ' + @cursor_name + N' CURSOR FOR select top 10 name from sys.all_columns OPEN ' + @cursor_name
+ N' FETCH NEXT FROM ' + @cursor_name
+ N' INTO @name WHILE @@FETCH_STATUS <> -1 BEGIN print @name FETCH NEXT FROM ' + @cursor_name + N' INTO @name end CLOSE '
+ @cursor_name + N' DEALLOCATE ' + @cursor_name
PRINT @cursor_sql
EXECUTE Sp_executesql
@cursor_sql
为游标名称添加一个guid,以保证始终不同。
然后根据该名称创建并执行查询。
希望有帮助!
您需要在动态sql语句中运行它。作为起点,您可以检查这个问题:在存储过程中使用带有动态 SQL 的游标
不确定其他人是否会从类似的搜索中找到这一点,但我们也遇到了类似的问题,即重复的游标名称,并且执行动态 sql 是一场安全噩梦。我们通过使用范围临时前缀 (#) 命名游标解决了该问题,似乎解决了该问题。
DECLARE #iter CURSOR FOR ...
OPEN #iter
FETCH NEXT FROM #iter INTO ...
WHILE @@FETCH_STATUS = 0
BEGIN
...
END
CLOSE #iter
DEALLOCATE #iter