解析JSON以满足存储过程中的最低要求
我一直在研究我对SQL Server和half stackoverflow上的每个页面的看法,但我找不到一个合适的解决方案 我们面临的挑战是如何处理从SQL Server发送/接收JSON的现有应用程序。因此,我们必须在SQL Server上构建一个强大的JSON体系结构 我们需要验证JSON的格式(遗留系统有自己的标准),以便消息的格式完全符合预期 问题是,JSON函数没有XML那么先进,似乎没有办法在SQLServer中验证模式 我们尝试了解析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,但似乎不
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,同样……是的,我们很难尝试和抓住,但它看起来像是一个大的应用程序对于这件事,这可能是唯一可行的解决办法,因此。。。