从另一个表中的JSON_VALUE更新TSQL列?

时间:2018-12-31 20:52:48

标签: json sql-server tsql

我有一个数据库,其中有两个表,其中一个包含有关访问网站的用户的一些信息,另一个包含第一个表的外键以及有关其请求的一堆JSON数据。

双跳存在问题,即它记录发出请求的服务帐户而不是用户名;由于此UserName记录在另一个表的ModelData列中,因此我想更正这些服务帐户。

这是我尝试过的:

UPDATE Table_A
SET Table_A.CreatedBy = JSON_VALUE(Table_B.ModelData,'$.Action.UserName')
FROM Table_A
INNER JOIN Table_B ON (Table_B.Table_AID = Table_A.ID)
WHERE CreatedBy LIKE '%svc.%'

我认为它会做什么:

  1. CreatedBy列当前等于“ svc”帐户的地方,
  2. 从另一个表中找到匹配的ModelData
  3. 从JSON字符串中提取UserName,并且
  4. 将其分配给CreatedBy

它的实际作用是抛出此错误:

  

JSON文本格式不正确。意外字符“。”位于位置0

1 个答案:

答案 0 :(得分:2)

LukStorms在我的假设中指出了问题;如果该字段为空,则找不到用户名,脚本将失败。经过几次检查后已解决此问题。

UPDATE Table_A
SET Table_A.CreatedBy = IIF(IsJson(Table_B.ModelData) > 0,
    IsNull(JSON_VALUE(Table_B.ModelData,'$.Action.UserName'), Table_A.CreatedBy),
    Table_A.CreatedBy)
FROM Table_A
INNER JOIN Table_B ON (Table_B.Table_AID = Table_A.ID)
WHERE CreatedBy LIKE '%svc.%'

首先,我们需要确保ModelData的内容实际上是一个JSON字符串,而不是普通文本或空白,然后我们还需要确保$.Action.UserName的实际JSON值是不为空。完成此操作后,我们就可以安全地写入值了。