代码之家  ›  专栏  ›  技术社区  ›  Java Team

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

  •  1
  • Java Team  · 技术社区  · 8 年前

    谁能告诉我如何在SQL Server中动态声明游标名称(固定名称+唯一名称)?

    这是为了防止错误

    2018年2月25日10:12:01错误(adhocreportserviceinpl.java:882):org。springframework。jdbc。UncategorizedSQLException:CallableStatementCallback;SQL的未分类SQLException[{调用usp\U AdHocReport(?,?,?,?,?,?,,?,?,?,,?,?,?,?,?)}];
    SQL状态【34000】;错误代码【16916】;[FMWGEN][SQLServer JDBC驱动程序][SQLServer]不存在名为“FetchRegion”的游标。;嵌套异常为java。sql。SQLException:[FMWGEN][SQLServer JDBC驱动程序][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
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Jorge Ribeiro    8 年前

    您可以使用这个示例,我使用一个系统表来获取前10行,但您可以创建自己的游标。

    将@cursor\u name声明为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,以确保始终不同。

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

    希望有帮助!

        2
  •  0
  •   AMINCHAR    8 年前

    您需要在动态sql语句中运行它。作为起点,您可以检查以下问题: Using a cursor with dynamic SQL in a stored procedure