【发布时间】:2018-10-17 22:42:02
【问题描述】:
我有一个程序应该 OPENJSON 并同时插入到两个表中,JSON 数组中的每个对象都有一行。例如,数组中的这两个对象会将两行数据插入“case_idents”表并输出 2 个 case_ident_id(101 和 102)并将这两个 id 插入“case_to_case_idents”表中。此过程不这样做,而是仅将 case_ident_id (102) 两次插入到“case_to_case_idents”表中,创建一个副本而不是创建唯一的行对象。
CREATE PROCEDURE case_idents_addAll
@case_ident_id INT OUTPUT,
@seq_id INT OUTPUT,
@identObj NVARCHAR(MAX),
/*
DECLARE @case_ident_id INT
DECLARE @seq_id INT
DECLARE @identObj NVARCHAR(MAX) = N'[
{
"name": "Jack",
"entityTypeCd": "SM",
"identStatus": "PR",
"caseId": 10034,
"caseStatusCd": "NUA"
},
{
"name": "Jill",
"entityTypeCd": "SF",
"identStatus": "PR",
"caseId": 10035,
"caseStatusCd": "NA"
}
]';
EXECUTE case_idents_addAll @identObj=@identObj, @case_ident_id=@case_ident_id OUTPUT, @seq_id=@seq_id OUTPUT
*/
AS
BEGIN
INSERT INTO case_idents
(name, entity_type_cd, ident_status, case_id)
SELECT name, entity_type_cd, ident_status, case_id
FROM OPENJSON(@identObj)
WITH (
name NVARCHAR(50) '$.name',
entity_type_cd CHAR(5) '$.entityTypeCd',
ident_status CHAR(5) '$.identStatus',
case_id INT '$.caseId'
)
SET @case_ident_id=SCOPE_IDENTITY();
INSERT INTO case_to_case_ident
(case_id, case_ident_id, case_status_cd, case_ident_status_cd)
SELECT case_id, @case_ident_id, case_status_cd, case_ident_status_cd
FROM OPENJSON(@identObj)
WITH (
case_id INT '$.caseId',
case_status_cd CHAR(5) '$.caseStatusCd',
case_ident_status_cd CHAR(5) '$.identStatus'
)
SET @seq_id = SCOPE_IDENTITY();
END
【问题讨论】:
-
case_id 在@identObj 中是否总是唯一的?阅读其他 cmets 我知道您可以进行多个调用,并且 case_id 在两个不同的调用中可能相同,但是同一 @identObj 值中是否会有多个 case_id ?如果您没有多个,可以在第一次插入时使用 OUTPUT 来捕获插入时的所有标识值,并在第二次插入中使用它。告诉我,我可以举个例子。
-
case_id 在@identObj 中不会是唯一的。因为每个案例可能有多个案例标识。
标签: json sql-server tsql