我一直在研究我对SQL Server上的每一页和半堆栈溢出的看法,我找不到合适的解决方案
我们的挑战是处理从SQL Server发送/接收JSON表单的现有应用程序。所以我们必须在SQL Server上构建一个STRONG JSON架构。
我们需要验证JSON的格式(遗留系统有自己的标准),因此消息具有完全预期的格式。
问题是,JSON函数不如XML那么先进,似乎无法在SQL Server中验证模式。
我们尝试使用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
/执行行为。
我们打算在继续处理数据之前验证最小模式,如果模式不符合标准,则返回错误。
如何实现这一目标?
(不知道我们在哪里阅读@ ptSQL1 = 0,但我相信在某处阅读)
答案 0 :(得分:1)
我们打算在继续之前验证最小模式 处理数据,如果架构不符合标准,则返回 一个错误。
必须解析JSON才能验证架构。为了解析JSON文档,prepare实际上并不执行查询,而sp_prepare
和sp_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;