5
votes

FOR JSON PATH entraîne un SSMS tronqué à 2033 caractères

Je concatène des chaînes ensemble en utilisant "for JSON path ('')".

J'ai défini les options Tools-> Options-> SQL Server-> Results to Grid sur max.

J'ai défini les options Outils-> Options-> SQL Server-> Résultats sur Texte sur max.

En exécutant la requête en mode Grille et en copiant les résultats d'une ligne / d'une colonne, je vois que la valeur de retour est limitée à 2033 caractères.

Comment puis-je m'assurer que la valeur renvoyée n'est pas tronquée?


1 commentaires

Je concatène des chaînes ensemble en utilisant "pour le chemin JSON - pourquoi? Peut-être pouvons-nous résoudre le problème que vous résolvez si vous nous donnez plus d'informations sur le problème et pourquoi vous avez pensé à pour Le chemin JSON était un bon ajustement.


4 Réponses :


8
votes

Le comportement est documenté ici :

Un grand ensemble de résultats divise la longue chaîne JSON sur plusieurs lignes.

Par défaut, SQL Server Management Studio (SSMS) concatène les résultats en une seule ligne lorsque le paramètre de sortie est Results to Grid. La barre d'état SSMS affiche le nombre réel de lignes.

D'autres applications clientes peuvent nécessiter du code pour recombiner de longs résultats en une seule chaîne JSON valide en concaténant le contenu de plusieurs lignes. Pour obtenir un exemple de ce code dans une application C #, consultez Utiliser la sortie FOR JSON dans une application cliente C # .

Par conséquent, utiliser FOR JSON pour concaténer des chaînes (lorsque le résultat est plus long que 2033 octets) n'est pas la meilleure idée.

Essayez d'utiliser FOR XML à la place. Par exemple:

SELECT STUFF((
    SELECT ', '+name FROM sys.columns FOR XML PATH(''), TYPE
).value('.','nvarchar(max)'),1,2,'')


1 commentaires

J'ai remarqué cela (et je l'ai mentionné) en 2015 , avant même la documentation. :-)



4
votes

J'ai eu une question similaire et j'ai trouvé une réponse en utilisant le résultat de la conversion au format varchar. Attention, le résultat sera toujours limité puisque varchar a 8000 caractères au maximum. Mais cela fonctionne pour ma situation. J'espère que cela aide.

SELECT CAST((SELECT [Columns] FROM [Tables] FOR JSON PATH('')) AS VARCHAR(MAX)) AS JSONDATA


0 commentaires

1
votes

Insérez dans une variable nvarchar (max) ou une table le fera.

DECLARE @JSON nvarchar(max)
SET @JSON = (SELECT * FROM Table FOR JSON AUTO)
PRINT @JSON

ou

declare @json table (j nvarchar(max));
insert into @json select * from(select* from Table where Criteria1 for json auto)a(j)
insert into @json select * from(select* from Table where Criteria2 for json auto)a(j)
select * from @json


0 commentaires

0
votes

J'ai réussi à faire fonctionner cela en utilisant un générateur de chaînes et en ajoutant les lignes supplémentaires dans la boucle DataReader.

Ma logique d'origine ne permettait qu'une seule ligne renvoyée - de sorte que lorsque le lecteur de données a bouclé plus d'une fois - il est tombé dans un problème de longueur de 2033+.


0 commentaires