【问题标题】:Looping array Cursor not looping more than once - SQL SERVER循环数组游标不循环多次 - SQL SERVER
【发布时间】:2020-07-14 11:18:10
【问题描述】:

我有一个数组,我在 Javascript 中将其字符串化,如下所示

 [{PlanID:1},{PlanID:2},{PlanID:3}]

我正在执行如下的 SP

exec save_plan [{PlanID:1},{PlanID:2},{PlanID:3}]

我正在尝试将每个计划 ID 保存为表 plan 中的每一行,为此我编写了下面的 SP 我正在循环数组并尝试打印 PlanID(稍后我将在适当的位置编写 INSERT 查询的 PRINT) 在循环内。

    USE [XYZ]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER Procedure save_plan
    @packages nvarchar(max)

    AS
    DECLARE
     @PlanID_FETCHED INT
     BEGIN

    DECLARE C CURSOR LOCAL FOR 
        SELECT PlanID
        FROM  OPENJSON ( @packages )  
        WITH (   
                PlanID  INT '$.PlanID'
         ) 
        OPEN C

        FETCH NEXT FROM C INTO  @PlanID_FETCHED
        WHILE @@FETCH_STATUS = 0      
        BEGIN

            PRINT @PlanID_FETCHED
        
            FETCH NEXT FROM C INTO  @PlanID_FETCHED
        END

        CLOSE C
        DEALLOCATE C

    end;

即使数组中有 3 个计划 ID,也只会插入一条记录。 光标不会循环多次。

【问题讨论】:

  • 我不得不问,但你为什么在这里使用CURSOR?这个 SP 的目的是什么,因为它只是打印;除了调试帮助之外,这实际上没有任何好处。
  • 另外,您的示例 JSON 无效。尝试解析会报错:db<>fiddle
  • 为什么要从输入 JSON 中逐行插入planid。如果修复 JSON 输入(PlanID 应该是 "PlanID"),声明 INSERT INTO plan (PlanID) SELECT PlanID FROM OPENJSON(REPLACE(@packages, N'PlanID', N'"PlanID"')) WITH (PlanID int '$.PlanID') 就足够了。

标签: sql sql-server stored-procedures sql-server-2016 sql-server-2016-express


【解决方案1】:

解析 JSON 时出现问题。如果我们像下面这样调用 proc,它可以正常工作。

exec save_plan '[{"PlanID":1},{"PlanID":2},{"PlanID":3}]'

请找到 dbfiddle here

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2012-03-27
    • 2012-04-28
    • 1970-01-01
    • 2020-08-26
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多