2017-10-20 4 views
0

Je suis en train de convertir mes données JSON dans un format de table dans SQL Server. Voici mes données JSON:OPENJSON impossible d'analyser les caractères chinois

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

Ce que j'avais essayé sont:

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 

Cependant , les deux table de temp me renvoyer fol résultat bas, avec les caractères chinois restent comme "???". table Temp résultat sélectionnez

emp_no emp_designation emp_name emp_name2

001 | Données Admin | Peter | ??

002 | Ingénieur logiciel | Lee | ?

Une idée de comment préserver les caractères chinois d'origine après avoir analysé les données dans la table temporaire?

Merci.

* Edit: Je sais qu'il peut travailler en mettant un extra « N » devant le JSON

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

Mais en fait le JSON est un paramètre dans un magasin de procédure, je ne peux pas ajouter simplement une N comme: set @JSON = 'N' + @JSON, ce qui mettra en péril le format des données JSON et provoquera une erreur.

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

Répondre

1

Essayez d'ajouter 'N' avant sql réglé pour indiquer que les caractères unicode sont contenus dans comme ceci:

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

Cette question peut aider à fond: What does N' stands for in a SQL script ? (the one used before characters in insert script)

+0

Désolé que je fais ne mentionne pas clairement, en fait mon JSON est un paramètre dans une procédure stockée. Je ne peux pas simplement mettre un « N » devant elle, si j'essaie de faire quelque chose comme ceci: \t set JSON = « N » + JSON Je frapperai une erreur, car la N entraînera la une erreur de format JSON invalide. –

+0

@CheeHouNg Comment appelez-vous la procédure stockée? Afficher le code – Tomalak

+0

@Tomalak Juste un code C# normal: 'var serializer = new JavaScriptSerializer(); var JsonString = serializer.Serialize (List_EmpInfo); chaîne connS = ConfigurationManager.ConnectionStrings ["DB_Connn"]. ConnectionString; SqlConnection connection = nouvelle SqlConnection (connS); SqlCommand cmd = nouvelle SqlCommand ("SP_StoreEmpInfo", connexion) { CommandType = CommandType.StoredProcedure }; cmd.Parameters.AddWithValue ("@ Json", JsonString); ' –