Sql 服务器 OPENJSON returns unicode 字符串

Sql Server OPENJSON returns unicode string

我对 SQL 服务器和 JSON 有问题:/

有很多 JSON 字符串来自远程数据库(我只有读取权限)。问题是所有这些都被解析为 unicode,我不知道如何将它们转换为 UTF-8!

看看这个JSON例如:

{
   "0":{
      "id":1,
      "name":"\u062a\u0646"
   },
   "1":{
      "id":2,
      "name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
   },
   "2":{
      "id":3,
      "name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
   },
   "5":{
      "id":6,
      "name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
   },
   "6":{
      "id":7,
      "name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
   }
}

如您所见,字段 name 被解析为 unicode。我这样做是为了将数据提取到 table:

SELECT Units.*
FROM OPENJSON(@Json) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
   [Id] INT '$.id',
   [Name] NVARCHAR(MAX) '$.name'
) AS Units

然后它会显示如下结果:

但我需要这样的结果:

ECMA-404 标准的一些解释:一个 JSON 字符串是用引号 (U+0022) 包裹的 Unicode 代码点序列。 ...如果代码点位于基本多语言平面(U+0000 到 U+FFFF),那么它可以表示为一个六字符序列:一个反斜线,后跟小写字母 u,再后跟编码代码点的四个十六进制数字。

似乎名称被转义了,所以一个可能的选择是替换转义的 \:

JSON:

DECLARE @json nvarchar(max) = N'{
   "0":{
      "id":1,
      "name":"\u062a\u0646"
   },
   "1":{
      "id":2,
      "name":"\u0628\u0633\u062a\u0647 10\u062a\u0627\u06cc\u06cc"
   },
   "2":{
      "id":3,
      "name":"\u0639\u062f\u062f 10\u062a\u0627\u06cc\u06cc"
   },
   "5":{
      "id":6,
      "name":"\u0639\u062f\u062f 1000\u062a\u0627\u06cc\u06cc"
   },
   "6":{
      "id":7,
      "name":"\u06a9\u06cc\u0644\u0648\u06af\u0631\u0645"
   }
}'

声明:

SELECT Units.*
FROM OPENJSON(REPLACE(@Json, N'\u', N'\u')) AS i
CROSS APPLY OPENJSON(i.[value]) WITH (
   [Id] INT '$.id',
   [Name] NVARCHAR(MAX) '$.name'
) AS Units

结果:

Id  Name
1   تن
2   بسته 10تایی
3   عدد 10تایی
6   عدد 1000تایی
7   کیلوگرم