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

解析JSON以满足存储过程中的最低要求,json,sql-server,Json,Sql Server,我一直在研究我对SQL Server和half stackoverflow上的每个页面的看法,但我找不到一个合适的解决方案 我们面临的挑战是如何处理从SQL Server发送/接收JSON的现有应用程序。因此,我们必须在SQL Server上构建一个强大的JSON体系结构 我们需要验证JSON的格式(遗留系统有自己的标准),以便消息的格式完全符合预期 问题是,JSON函数没有XML那么先进,似乎没有办法在SQLServer中验证模式 我们尝试了sp_prepare和sp_execute,但似乎不

我一直在研究我对SQL Server和half stackoverflow上的每个页面的看法,但我找不到一个合适的解决方案

我们面临的挑战是如何处理从SQL Server发送/接收JSON的现有应用程序。因此,我们必须在SQL Server上构建一个强大的JSON体系结构

我们需要验证JSON的格式(遗留系统有自己的标准),以便消息的格式完全符合预期

问题是,JSON函数没有XML那么先进,似乎没有办法在SQLServer中验证模式

我们尝试了
sp_prepare
sp_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,但我相信在哪里读过)

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

必须解析JSON才能验证模式。prepare实际上并不是为了解析JSON文档而执行查询,加上
sp_prepare
sp_execute
是不打算在t-SQL中直接调用的内部API系统存储过程

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

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;

读这样的帖子:这似乎并不容易…:-(写一个C#代码来验证,而不是写一个存储过程。这种验证最好不要在DBMS端进行。@KunalMukherjee,问题是DB应该响应多个系统,所以在一个外部应用程序中进行,增加了体系结构的复杂性。@gofr1,同样……是的,我们很难尝试和抓住,但它看起来像是一个大的应用程序对于这件事,这可能是唯一可行的解决办法,因此。。。