【问题标题】:Parsing a JSON to meet minimum requirements inside a stored procedure解析 JSON 以满足存储过程中的最低要求
【发布时间】:2017-12-09 21:56:03
【问题描述】:

我一直在查看我对 SQL Server 和半堆栈溢出的每一页的看法,但我找不到合适的解决方案

我们的挑战是处理从 SQL Server 发送/接收 JSON 的现有应用程序。所以我们必须在 SQL Server 上构建一个 STRONG JSON 架构。

我们需要验证 JSON 的格式(旧系统有自己的标准),因此消息的格式与预期的完全一致。

问题是,JSON 函数不如 XML 先进,而且似乎没有办法在 SQL Server 中验证架构。

我们尝试使用sp_preparesp_execute,但这似乎不起作用。

我们测试了这样的东西:

Declare @ptSQL1 int;  
Exec sp_prepare @ptSQL1 output,   
    N'@P1 nvarchar(128), @json NVARCHAR(1000) ',  
    N'  SELECT *
            INTO  temp_tblPersons
            FROM OPENJSON (@json, ''$.root'')
            WITH (
                Cname NVARCHAR(100) ''strict$.FirstName'',
                Csurname NVARCHAR(100) ''lax$.surname''   
            ) as J
            where Csurname like @P1';


DECLARE @json7 NVARCHAR(1000)
SET @json7 = N'{
    "root": [
        { "FirstName": "Charles" , "surname":"perez" },
        { "FirstName": "Jade" , "surname":"pelaz"  },
        { "FirstName": "Jim" , "surname":"alvarez" },
        { "FirstName": "Luke" , "surname":"alonso" },
        { "FirstName": "Ken"}
    ]
}'


IF (@ptSQL1 = 0) PRINT 'THE SUPPLY JSON IS NOT VALID'
ELSE Exec sp_execute @ptSQL1, N'a%', @json7;

但不符合sp_prepare/execute 的行为。

我们打算在继续处理数据之前验证最小架构,如果架构不符合标准,则返回错误。

如何做到这一点?

(不确定我们在哪里读到 @ptSQL1 = 0,但我相信在某处读到)

【问题讨论】:

  • 阅读这样的帖子:stackoverflow.com/questions/39652524/… 这似乎并不容易...... :-(
  • 写一个C#代码来生效,而不是写一个存储过程。
  • 这种验证最好不要在 DBMS 端进行。
  • @KunalMukherjee ,问题是数据库应该响应多个系统,因此在外部应用程序中这样做会增加架构的复杂性。
  • @gofr1 一样一样...

标签: json sql-server


【解决方案1】:

我们打算在继续之前验证最小架构 处理数据,如果schema不符合标准,返回 一个错误。

必须解析 JSON 才能验证架构。 prepare 并不实际执行查询来解析 JSON 文档,另外,sp_preparesp_execute 是内部 API 系统存储过程,不打算在 T-SQL 中直接调用。

虽然目前无法在 T-SQL 中验证 JSON 模式(无需编写自定义 SQLCLR 程序集),但您可以使用 TRY/CATCH 并处理错误。下面的示例以不同的方式处理 JSON 错误,但我个人只会THROW 所有错误并处理应用代码中的特定错误。

DECLARE @json NVARCHAR(1000);
DECLARE @P1 NVARCHAR(128) = 'a%';

SET @json = N'{
    "root": [
        { "FirstName": "Charles" , "surname":"perez" },
        { "FirstName": "Jade" , "surname":"pelaz"  },
        { "FirstName": "Jim" , "surname":"alvarez" },
        { "FirstName": "Luke" , "surname":"alonso" },
        { "FirstName": "Ken"}
    ]
}';

BEGIN TRY
    SELECT *
                INTO  temp_tblPersons
                FROM OPENJSON (@json, '$.root')
                WITH (
                    Cname NVARCHAR(100) 'strict$.FirstName',
                    Csurname NVARCHAR(100) 'lax$.surname'   
                ) as J
                where Csurname like @P1;
END TRY
BEGIN CATCH
    DROP TABLE IF EXISTS temp_tblPersons;
    IF ERROR_MESSAGE() LIKE N'%JSON%'
    BEGIN
        PRINT 'THE SUPPLY JSON IS NOT VALID';
    END
    ELSE
    BEGIN
        THROW;
    END;
END CATCH;

【讨论】:

  • 是的,我们对 TRY 和 CATCH 很苛刻,但是这件事看起来有点大,因此它可能是唯一可行的解​​决方案......
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2015-02-08
  • 2019-05-02
  • 2013-07-24
  • 1970-01-01
  • 2018-09-07
  • 2017-11-18
相关资源
最近更新 更多