【发布时间】: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