如何在 SQL Server 中动态命名游标

问题描述 投票:0回答:3

谁能告诉我如何在 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
sql-server cursor
3个回答
1
投票

您可以使用此示例,我使用系统表来获取前 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,以保证始终不同。

然后根据该名称创建并执行查询。

希望有帮助!


0
投票

您需要在动态sql语句中运行它。作为起点,您可以检查这个问题:在存储过程中使用带有动态 SQL 的游标


0
投票

不确定其他人是否会从类似的搜索中找到这一点,但我们也遇到了类似的问题,即重复的游标名称,并且执行动态 sql 是一场安全噩梦。我们通过使用范围临时前缀 (#) 命名游标解决了该问题,似乎解决了该问题。

DECLARE #iter CURSOR FOR ...

OPEN #iter
FETCH NEXT FROM #iter INTO ...

WHILE @@FETCH_STATUS = 0
BEGIN
...
END

CLOSE #iter
DEALLOCATE #iter
© www.soinside.com 2019 - 2024. All rights reserved.