J'ai une chaîne de type de données J'ai besoin de tronquer la chaîne ci-dessus comme ci-dessous: P> nvarchar (max) code> comme ceci:
declare @cbCheckdate nvarchar(max) ='{"request_id":"364202","final_decision":"FAIL","derived_Attribute_1":"PASS|Number of active MFI :1",
"derived_Attribute_4":"PASS|Total Exposure + Applied Amount :53051.0",
"derived_Attribute_3":"PASS|Number of Total Active Institutions :2",
"derived_Attribute_2":"FAIL|Overdue Amount:17984.0","derived_Attribute_5":"PASS|Write off amount:0.0"'
6 Réponses :
Cette entrée est probablement au format JSON, donc si vous utilisez SQL Server 2016+, vous pouvez utiliser Déclaration: p> résultat: p> json_modify () code> fonction pour supprimer la touche
CBRESPONSSSG CODE> de l'entrée JSON :
'JSON_MODIFY' n'est pas un nom de fonction intégré reconnu.
@ Mar1009 Oui, j'ai mentionné cela dans la réponse, le support JSON a été introduit dans SQL Server 2016. Si votre texte est valide JSON, vous devrez peut-être rechercher UDF pour analyser ce JSON ou essayer d'utiliser une autre approche, probablement basée sur la chaîne ou Transformations XML.
Vous pouvez faire cela
Cette approche ne fonctionne pas i> b> si la chaîne @cbcheckdate code> ne contient pas
cbresponsemg code> - dans ce cas, vous obtenez :
msg 537, niveau 16, état 3, ligne 3 paramètre de longueur non valide passés à la fonction de gauche ou de sous-chaîne. Code>
Puisque vous êtes sur SQL Server DECLARE @cbCheckdate NVARCHAR(MAX) = N'
{"request_id":"364202","final_decision":"FAIL","derived_Attribute_1":"PASS|Number of active MFI :1",
"derived_Attribute_4":"PASS|Total Exposure + Applied Amount :53051.0",
"derived_Attribute_3":"PASS|Number of Total Active Institutions :2",
"derived_Attribute_2":"FAIL|Overdue Amount:17984.0","derived_Attribute_5":"PASS|Write off amount:0.0",
"cbResponseMsg":"Final Decision:FAIL || Number of active MFI :1 || Total Exposure + Applied Amount :53051.0
|| Number of Total Active Institutions :2 || FAILOve'
DECLARE @Delimiter NVARCHAR(MAX) = N'cbResponseMsg';
SELECT
dbo.TruncateAfter (@cbCheckdate, @Delimiter)
Je n'arriverais pas à faire cela dans une fonction scalaire définie par l'utilisateur. Ils sont notoires pour les problèmes de performance.
@Zoharpeled: à ma connaissance, tant que vous ne "masquez" aucun accès réel de données (à l'aide d'un Sélectionnez CODE>) dans votre fonction scalaire, la performance ne doit pas vraiment être une grande question. Cette fonction stockée ne fonctionne que sur les paramètres d'entrée et ne fait aucune "forte levée" de cette façon - alors je suis sûr que cela devrait être tout à fait acceptable
Voici un moyen sûr de faire cela, sans fonctions définies par l'utilisateur, à l'aide des fonctions intégrées Voici la panne de l'intérieur: p> Stuff code>,
charindex code>,
inverse code>,
LEN code> et
signe code>:
charindex (@Delimiter, @cbcheckdate) code> retournera 0 si le délimiteur n'a pas été trouvé, ni un entier positif s'il est trouvé dans la chaîne. LI>
signe code> retournera
0 code> pour
0 code>,
1 code> pour un nombre positif ou (non pertinent dans ce cas)
-1 code> pour un nombre négatif. li>
charindex (inverse (@Delimiter), inverse (@cbcheckdate)) +
Len (@Delimiter) * Signe (Charindex (@Delimiter, @cbcheckdate)) Code> retournera
0 code> est le délimiteur introuvable ou un entier positif représentant le nombre de caractères entre le début du délimiteur à la fin de la chaîne. LI>
1 code>) et remplacez le nombre de caractères qu'il prend en tant que troisième argument. li>
inverse code> le résultat une fois de plus pour renvoyer la chaîne dans le bon ordre. LI>
ul> p>
Vous pouvez essayer ce
note: b> Une expression de cas n'est pas toujours court-circuit , ce qui signifie que sous certains Circonstances, ce code pourrait lancer une erreur pour la fonction code> gauche code>.
N'est-ce pas le comportement des entiers? Jamais eu des problèmes lors de l'utilisation de (var) Char
Je ne pense pas que le type de données est le problème ... Je sais juste que ce n'est pas garanti de court-circuit, je ne connais pas les conditions exactes.
Essayez ceci comme une requête simple et efficace:
Quelle est votre version SQL Server?
SQL VERSION 2014