OPENJSON无法解析中文字符

时间:2017-10-20 03:37:27

标签: sql-server json

我试图将我的JSON数据转换为SQL Server中的表格格式。 以下是我的JSON数据:

[{
    "emp_no": "001",
    "emp_designation":"Data Admin",
    "emp_name": "Peter",
    "emp_name2": "彼特"
  },
  {
    "emp_no": "002",
    "emp_designation":"Software Engineer",
    "emp_name": "Lee",
    "emp_name2": "李"
  }]

我曾尝试的是:

DECLARE @JSON NVARCHAR(MAX)

set @JSON='[{
"emp_no": "001",
"emp_designation":"Data Admin",
"emp_name": "Peter",
"emp_name2": "彼特"},
 {
"emp_no": "002",
"emp_designation":"Software Engineer",
"emp_name": "Lee",
"emp_name2": "李"
 }]'

- 方法1

 SELECT * INTO #emp_temp FROM OPENJSON(@JSON)
 WITH (emp_no varchar(20),
 emp_designation varchar(50),
 emp_name NVARCHAR(100),
 emp_name2 NVARCHAR(100))

SELECT * FROM #Emp_temp
DROP TABLE #Emp_temp

- 方法2

SELECT 
JSON_Value (EMP.VALUE, '$.emp_no') as emp_no, 
JSON_Value (EMP.VALUE, '$.emp_designation') as emp_designation,
JSON_Value (EMP.VALUE, '$.emp_name') as emp_name, 
JSON_Value (EMP.VALUE, '$.emp_name2') as emp_name2
INTO  #Emp_temp2
FROM OPENJSON (@JSON) as EMP

SELECT * FROM #Emp_temp2
DROP TABLE #Emp_temp2

然而,两个临时表都返回了我的结果,中文字符仍为" ???"。 临时表选择结果

emp_no emp_designation \ temp_name \ temp_name2

001 |数据管理员|彼得| ??

002 |软件工程师|李| ?

知道在将数据解析成临时表后如何保留原始汉字?

感谢。

*编辑: 我知道它可以通过增加一个额外的N'在JSON前面

set @JSON=N'[
    { "emp_no": "001...
   .....

但实际上JSON是Store Procedure中的一个参数,我不能简单地添加一个N喜欢:set @JSON =' N' + @JSON, 这将危及JSON数据的格式,并导致错误。

ALTER PROCEDURE [dbo].[SP_StoreEmpInfo]
 @JSON NVARCHAR(max)

 @JSON = 'N' + @JSON

/*Will cause invalid JSON format error */
SELECT 
JSON_Value (EMP.VALUE, '$.emp_no') as.....

1 个答案:

答案 0 :(得分:2)

尝试在sql set之前添加'N'以指示unicode字符包含在这样的内容中:

DECLARE @JSON NVARCHAR(MAX)

set @JSON=N'[{
"emp_no": "001",
"emp_designation":"Data Admin",
"emp_name": "Peter",
"emp_name2": "彼特"},
 {
"emp_no": "002",
"emp_designation":"Software Engineer",
"emp_name": "Lee",
"emp_name2": "李"
 }]'

这个问题可能有助于背景:  What does N' stands for in a SQL script ? (the one used before characters in insert script)

相关问题