2017-10-20 23 views
0

我想將我的JSON數據轉換爲SQL Server中的表格格式。 以下是我的JSON數據:OPENJSON無法解析中文字符

[{ 
    "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": "李" 
}]' 

--Method 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 

--Method 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 EMP_NAME emp_name2

001 |數據管理|彼得| ??

002 |軟件工程師|李| ?

任何想法如何在解析數據到臨時表後保留原始漢字?

謝謝。

*編輯: 我知道它可以通過將一個額外的「否」的JSON

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

前面的工作,但實際上是JSON是一個存儲過程的參數,我不能簡單地添加A 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

嘗試增加「N」之前,你的SQL設置爲指示的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)

+0

對不起,我做的沒有提到清楚,實際上我的JSON是一個存儲過程中的參數。 我不能簡單地把一個「N」在它的面前,如果我嘗試做這樣的事情: \t集JSON =「N」 + JSON 我會打一個錯誤,由於N將導致無效JSON格式的錯誤。 –

+0

@CheeHouNg你如何調用存儲過程?顯示代碼。 – Tomalak

+0

@Tomalak 只是一個正常的C#代碼: 'var serializer = new JavaScriptSerializer(); var JsonString = serializer.Serialize(List_EmpInfo); string connS = ConfigurationManager.ConnectionStrings [「DB_Connn」]。ConnectionString; SqlConnection connection = new SqlConnection(connS); SqlCommand cmd = new SqlCommand(「SP_StoreEmpInfo」,連接) {0} {0} {0} CommandType = CommandType。StoredProcedure }; cmd.Parameters.AddWithValue(「@ Json」,JsonString);' –