【问题标题】:Dynamic stored procedure based upon json input基于json输入的动态存储过程
【发布时间】:2021-03-31 10:02:02
【问题描述】:

我想根据输入JSON对象的结构写一个动态存储过程。

{
  "store": {
    "storeId": 123,
    "name": "TEST",
    "location":{                     //This is optional
      "address1": "Some Address",
      "address2": "Some Address"
     }
  }
}

在数据库中,我有两个表 STORELOCATION。 在编写存储过程时,我想验证位置键是否存在,例如

IF EXISTS (SELECT JSON_VALUE(@store, '$.store.location'))
BEGIN
Select * from LOCATION where STORE_ID = JSON_VALUE(@store, '$.store.storeId')
END

但是这个 IF 条件总是返回 true。即使“位置”键不存在。如何实现?

【问题讨论】:

  • "如果位置是关键是否存在" 嗯? is key is present 是什么意思?
  • 至于EXISTS为什么总是返回TRUE,那是因为EXISTS检查是否返回任何行,而不是返回的值是否为NULL。标量函数将总是返回一个值,因为NULL 仍然是一个值;只是一个未知的。你想要IF JSON_VALUE(@store, '$.store.location') IS NOT NULL

标签: sql-server sql-server-2017


【解决方案1】:

IF EXISTS 在子查询至少返回一行时返回TRUE。当您运行查询并且可选值不存在时,将返回单行单列结果以及 NULL 值。因此,IF 条件将始终为TRUE

以下是仅在存在location json 对象时执行查询的一种方法(根据@Zhorov 的评论编辑为使用JSON_QUERY):

IF (SELECT JSON_QUERY(@store, '$.store.location')) IS NOT NULL
BEGIN
    Select * from LOCATION where STORE_ID = JSON_VALUE(@store, '$.store.storeId')
END

【讨论】:

  • JSON_VALUE(@store, '$.store.location')) 将返回null 或错误(在strict 模式下),因为$.store.location 指向一个JSON 对象,而不是一个标量值。我认为JSON_QUERY() 在这里更合适。但我同意,答案的基本部分是使用 EXISTS 关键字。从我这边 +1。
  • 第一个SELECT 是不必要的。我希望有一个 JSON_EXIST 函数(我也希望我们有 JQuery,但无论如何......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多