0
votes

Comment tronquer une chaîne après un mot spécifique?

J'ai une chaîne de type de données nvarchar (max) code> comme ceci: xxx pré>

J'ai besoin de tronquer la chaîne ci-dessus comme ci-dessous: P>

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"'


2 commentaires

Quelle est votre version SQL Server?


SQL VERSION 2014


6 Réponses :


0
votes

Cette entrée est probablement au format JSON, donc si vous utilisez SQL Server 2016+, vous pouvez utiliser json_modify () fonction pour supprimer la touche CBRESPONSSSG de l'entrée JSON :

Déclaration: xxx

résultat: xxx


2 commentaires

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



0
votes

Vous pouvez faire cela xxx


1 commentaires

Cette approche ne fonctionne pas si la chaîne @cbcheckdate ne contient pas cbresponsemg - 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.



1
votes

Puisque vous êtes sur SQL Server 2014 forte> et ne pas avoir le support JSON intégré encore, j'écrirais probablement une petite fonction pour cela:

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)


2 commentaires

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



0
votes

Voici un moyen sûr de faire cela, sans fonctions définies par l'utilisateur, à l'aide des fonctions intégrées Stuff , charindex , inverse , LEN et signe : xxx

Voici la panne de l'intérieur:

  • charindex (@Delimiter, @cbcheckdate) retournera 0 si le délimiteur n'a pas été trouvé, ni un entier positif s'il est trouvé dans la chaîne.
  • signe retournera 0 pour 0 , 1 pour un nombre positif ou (non pertinent dans ce cas) -1 pour un nombre négatif.
  • charindex (inverse (@Delimiter), inverse (@cbcheckdate)) + Len (@Delimiter) * Signe (Charindex (@Delimiter, @cbcheckdate)) retournera 0 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.
  • la fonction true placez dans une chaîne vide dans la chaîne source, à partir du premier caractère ( 1 ) et remplacez le nombre de caractères qu'il prend en tant que troisième argument.
  • et enfin, puisque tout cela étant fait sur la chaîne inversée, inverse le résultat une fois de plus pour renvoyer la chaîne dans le bon ordre.

0 commentaires

0
votes

Vous pouvez essayer ce xxx


3 commentaires

note: 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 gauche .


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.



0
votes

Essayez ceci comme une requête simple et efficace: xxx


0 commentaires