解析JSON以满足存储过程中的最低要求

时间:2017-12-04 10:37:02

标签: json sql-server

我一直在研究我对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 /执行行为。

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

如何实现这一目标?

(不知道我们在哪里阅读@ ptSQL1 = 0,但我相信在某处阅读)

1 个答案:

答案 0 :(得分:1)

  

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

必须解析JSON才能验证架构。为了解析JSON文档,prepare实际上并不执行查询,而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;