【问题标题】:Detect duplicate JSON nodes in JSON parameter before insert in SQL Server table在插入 SQL Server 表之前检测 JSON 参数中的重复 JSON 节点
【发布时间】:2021-07-11 15:08:47
【问题描述】:

我想在将 JSON 中的重复节点插入 SQL Server 表之前检测它们。

我有这个存储过程,它采用这样的 JSON 参数:

CREATE PROCEDURE Core.myModelEditAction
    @OrganPersonID INT,
    @SalaryItems  NVARCHAR(2000),
    @AcceptLanguage NVARCHAR(50) = "fa"
AS
    DECLARE @Message NVARCHAR(MAX) = N''
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION
            INSERT INTO Core.PersonSalary (OrganPersonID, SalaryItemID, Amount)
                SELECT @OrganPersonID, SalaryItemID, Amount
                FROM OPENJSON (@SalaryItems)
                     WITH (OrganPersonID int,
                           SalaryItemID int,
                           Amount int) 

如果@SalaryItems 有重复键,我想返回异常

如何检测

SELECT @OrganPersonID, SalaryItemID, Amount
FROM OPENJSON (@SalaryItems)

在我的代码中此表重复?

【问题讨论】:

  • 样本数据和预期行为真的可以帮助我们帮助您。 JSON 中的“关键”元素是什么?
  • 你先检查the documentation了吗?

标签: sql json sql-server duplicates


【解决方案1】:

使用不带with 子句的OPENJSON(),以便返回原始的keyvaluetype 列,例如:

declare @SalaryItems nvarchar(2000) = N'{
  "OrganPersonID": 1,
  "SalaryItemID": 1,
  "Amount": 1,
  "SalaryItemID": 1,
  "SalaryItemID": 1
}';

-- Detect duplicated keys...
select [key], count(1) as count
from openjson(@SalaryItems)
group by [key]
having count(1) > 1;
key           count
------------- -----
SalaryItemID      3

【讨论】:

  • 这似乎有点奇怪,但我必须承认;如果 OP 只想为每个元素传递一个值,为什么不为每个元素使用标量参数?如果这是对问题的正确解释,那么这感觉就像一个 XY 问题。
  • 打败我,我只是在这里做志愿者。
  • 我并不是说答案是错误的,别担心,如果这个正确的,那么 OP 应该重新考虑他们的应用程序代码。
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2021-02-19
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
相关资源
最近更新 更多