J'ai une table avec deux colonnes: ici, les RawData permettront de sauvegarder les données de format JSON dans la chaîne, par exemple ci-dessous sera les données de cette colonne: p> < Pré> xxx pré> Résultat attendu: p> J'ai besoin de ces noms personnalisés, Customercumber, LoandisbProduct à afficher dans des champs distincts pour chaque rangée.
Aussi de noter que les détails du client à l'intérieur de Rawdata pour chaque ligne seront plus de deux dans de nombreux cas. P> Je ne sais pas comment déchirer les données à l'intérieur de la colonne Rawdata. P> et je 'M Utilisation de SQL Server 2012 et il ne prend pas en charge les données JSON, je dois donc manipuler la chaîne et obtenir le champ. P> P>
3 Réponses :
Merci à BLOG DE GATE RED , Définissez d'abord une vue code> comme suit: (Je vais utiliser ce puis créez une fonction comme suit (cette fonction est identique à celle du blog de porte rouge, mais je l'ai changé un peu et inclure Le Enfin, si nous avons ce tableau et les données: p> Voir code> pour générer un nouveau
unique identifiant" / code> à l'intérieur de la fonction)
identifiant code> en elle): p>
CustomerName | CustomerNumber | LoanDisbProduct
------------------------------------------------------
John | 192222 | null
Mahalakshmi | 430833 | Emergency Loan
K C Nalina | 1917889 | null
weldon | 435874 | Emergency Loan
Si vous ne savez pas combien de clients pour chaque ligne, vous ne devez pas déchiqueter chaque client à un seul champ, au moins un client PR de la rangée.
Voici un démarrage sur la déchiquetage des données, j'utilise le DBO.String_Split fonction de cette page:
premier i Split par {} dans le JSON, puis je me suis séparé par ",", puis vous avez le nom et la valeur d'attribut pour chaque identifiant, avec la numérotation des clients de chaque rangée. P>
Je pourrais avoir été divisé sur ', de la même manière que pour' {...} 'Cependant, j'ai choisi d'utiliser une fonction pour cela. P>
Tout dépend de la même structure du JSON . Pour mieux analyser SQL Server 2016+ serait recommandé. P>
+âââââ+ââââââââââââââââ+ââââââââââââââââââ+âââââââââââââââââ+ | id | CustomerOrder | Attribute | value | +âââââ+ââââââââââââââââ+ââââââââââââââââââ+âââââââââââââââââ+ | 1 | 1 | customerName | K C Nalina | | 1 | 1 | attendance | P | | 1 | 1 | collectedAmount | 757 | | 1 | 1 | isOverdrafted | false | | 1 | 1 | loanDisbProduct | null | | 1 | 1 | paidBy | Y | | 1 | 1 | customerNumber | 1917889 | | 1 | 1 | totalDue | 757 | | 2 | 1 | customerName | John | | 2 | 1 | attendance | P | | 2 | 1 | collectedAmount | 700 | | 2 | 1 | isOverdrafted | false | | 2 | 1 | loanDisbProduct | null | | 2 | 1 | paidBy | Y | | 2 | 1 | customerNumber | 192222 | | 2 | 1 | totalDue | 788 | | 2 | 2 | customerName | weldon | | 2 | 2 | attendance | P | | 2 | 2 | collectedAmount | 771 | | 2 | 2 | isOverdrafted | false | | 2 | 2 | loanDisbProduct | Emergency Loan | | 2 | 2 | paidBy | Y | | 2 | 2 | customerNumber | 435874 | | 2 | 2 | totalDue | 757 | | 1 | 2 | customerName | Mahalakshmi | | 1 | 2 | attendance | P | | 1 | 2 | collectedAmount | 881 | | 1 | 2 | isOverdrafted | false | | 1 | 2 | loanDisbProduct | Emergency Loan | | 1 | 2 | paidBy | Y | | 1 | 2 | customerNumber | 430833 | | 1 | 2 | totalDue | 757 | +âââââ+ââââââââââââââââ+ââââââââââââââââââ+âââââââââââââââââ+
La fonction string_split est disponible dans SQL Server 2016 ou supérieure. Niveau de compatibilité 130 ou supérieur, et n'est pas disponible dans SQL Server 2012 ( docs.microsoft.com/en-us/sql/t-sql/functions/.../a>)
Ouais c'est pourquoi j'ai inclus un lien vers une mise en œuvre qui fonctionne en 2012;)
Super travail Søren!
meilleur était de passer à V2016 +. Avec le support JSON, c'était facile ...
sur V2012, vous devez pirater. Ce pourrait être un meilleur choix d'utiliser un autre outil pour cela. Mais, si vous devez vous tenir à TSQL, j'essaierais de transformer le JSON en attributs XML centré comme ici: p> - la requête p> SELECT cd.id
,OneCustomer.value('@customerName','nvarchar(max)') AS CustomerName
,OneCustomer.value('@attendance','nvarchar(max)') AS Attendance
--more attributes
FROM @customerData cd
CROSS APPLY(SELECT REPLACE(REPLACE(REPLACE(cd.rawData,'false','"0"'),'true','"1"'),'null','"#NULL"')) A(JustStringValues)
CROSS APPLY(SELECT CAST(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(JustStringValues,'[',''),']',''),'},{"',' /><x '),'{"','<x '),'}',' />'),'","','" '),'":"','="') AS XML)) B(SinlgeRow)
CROSS APPLY B.SinlgeRow.nodes('/x') AS C(OneCustomer);
Ce ou que a > Répondez à votre question ..?
Mon conseil serait de le faire en dehors de SQL Server, en utilisant un langage de programmation. Cela va probablement être beaucoup plus facile d'écrire et de maintenir peu importe la langue que vous choisissez de l'écrire, et probablement beaucoup plus rapidement que les manipulations de chaîne dans T-SQL.