Comment affichez-vous tout le texte d'un ntext ou nvarchar (max) dans SSMS?

193

Comment afficher TOUT le texte d'un NTEXT ou NVARCHAR (max) dans SQL Server Management Studio? Par défaut, il semble ne renvoyer que les premières centaines de caractères (255?) Mais parfois je veux juste un moyen rapide de visualiser tout le champ, sans avoir à écrire un programme pour le faire. Même SSMS 2012 a toujours ce problème :(

NickG
la source
1
duplication possible de la façon d'obtenir l'ensemble des résultats complet de SSMS
Martin Smith

Réponses:

91

Options (Résultats de la requête / SQL Server / Résultats vers la page de grille)

Pour modifier les options des requêtes en cours, cliquez sur Options de requête dans le menu Requête ou cliquez avec le bouton droit dans la fenêtre Requête SQL Server et sélectionnez Options de requête.

...

Nombre maximum de caractères récupérés
Entrez un nombre compris entre 1 et 65535 pour spécifier le nombre maximum de caractères qui seront affichés dans chaque cellule.

Le maximum est, comme vous le voyez, 64k. La valeur par défaut est beaucoup plus petite.

BTW Results to Text a des limitations encore plus drastiques:

Nombre maximum de caractères affichés dans chaque colonne
Cette valeur est par défaut de 256. Augmentez cette valeur pour afficher des jeux de résultats plus volumineux sans troncature. La valeur maximale est de 8 192.

Remus Rusanu
la source
1
Comme Remus l'a écrit dans sa réponse, il y a des limitations, car la taille de stockage maximale pour le type de données dans la colonne définie avec MAX est de 2 Go, il doit donc y avoir une limitation car il serait fastidieux d'afficher toutes ces données dans SSMS.
Ivan G
13
@IvanG - Pas vraiment. Il pourrait simplement être hyperlié de la même manière que XML et cliquer dessus l'ouvrirait dans une nouvelle fenêtre. Le travail autour que j'utilise normalement est de le convertir en XML comme ici . Les données XML peuvent être définies pour autoriser une longueur illimitée.
Martin Smith
@MartinSmith Intéressant, il est donc possible de faire en sorte que SSMS affiche une telle quantité de données ...
Ivan G
11
Ne fonctionne que si le nombre de caractères <65535, ce qui est loin du maximum ntext.
Polyfun
1
@IvanG même 'Result to File' souffre de cette limite.
Iain
217

J'ai pu extraire le texte intégral (99208 caractères) d'une colonne NVARCHAR (MAX) en sélectionnant (Results To Grid) uniquement cette colonne, puis en cliquant dessus avec le bouton droit de la souris, puis en enregistrant le résultat sous forme de fichier CSV. Pour afficher le résultat, ouvrez le fichier CSV avec un éditeur de texte (PAS Excel). Assez drôle, lorsque j'ai essayé d'exécuter la même requête, mais que les résultats dans le fichier étaient activés, la sortie était tronquée à l'aide de la limite Résultats dans le texte.

Le contournement que @MartinSmith a décrit comme un commentaire à la réponse (actuellement) acceptée n'a pas fonctionné pour moi (j'ai obtenu une erreur en essayant d'afficher le résultat XML complet se plaignant de "Le caractère '[', valeur hexadécimale 0x5B, ne peut pas être inclus dans un nom ").

Eric
la source
17
Un clic droit, enregistrer sous, au format CSV a fonctionné pour moi comme un charme pour obtenir une énorme valeur de texte d'un champ NTEXT.
David Alpert
3
@ajeh: quelle version de SSMS 2012 utilisez-vous? Je viens de le tester (j'ai suivi exactement les mêmes étapes que j'ai décrites dans ma réponse) avec mon SSMS 2012 (version 11.0.5343.0) et cela fonctionne
Eric
8
Mais ne l'ouvrez pas dans Excel, l'importation CSV tronquera à nouveau les données. :)
Johncl
1
Merci, cela m'a permis d'exporter 7 Mo de données texte à partir d'un champ varchar (max) en utilisant SSMS 2012.
Brian Hasden
2
L'enregistrement en tant que texte délimité par des tabulations fonctionne mieux. Le format csv double toutes les citations dans le texte.
davidthegrey
140

Astuce rapide-

SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629
André Kops
la source
6
Cela fonctionne parfaitement (sans la partie CDATA) lorsque le contenu de la colonne est en fait XML
axk
2
Cela a fonctionné pour moi aussi, j'avais des données json dont j'avais besoin pour sortir de ms sql.
Dev_Corps
1
De plus, le contenu est échappé XML. Une fois que vous avez retiré le texte, vous devez le désagréger à l'aide d'un outil tel que freeformatter.com.
harsimranb
Cela a fonctionné pour moi: `` DECLARE @g geography; ... sélectionnez Cast (@ g.ToString () as xml); ``
Sergei Zinovyev
1
Cela a fonctionné pour moi avec SSMS v18 pour afficher une chaîne json de 250 Ko qui a été tronquée par d'autres solutions. De plus, je l'aime car il vous donne un lien vers une visionneuse de texte. +!
Roberto
54

J'ai écrit un complément pour SSMS et ce problème y est résolu. Vous pouvez utiliser l'une des 2 méthodes suivantes:

vous pouvez utiliser "Copier la cellule actuelle 1: 1" pour copier les données de la cellule d'origine dans le presse-papiers:

http://www.ssmsboost.com/Features/ssms-add-in-copy-results-grid-cell-contents-line-with-breaksCopier le contenu d'origine de la cellule

Ou, alternativement, vous pouvez ouvrir le contenu de la cellule dans un éditeur de texte externe (notepad ++ ou notepad) en utilisant la fonction "Cell visualizers": http://www.ssmsboost.com/Features/ssms-add-in-results-grid-visualizers

(la fonctionnalité permet d'ouvrir le contenu du champ dans n'importe quelle application externe, donc si vous savez qu'il s'agit de texte - vous utilisez l'éditeur de texte pour l'ouvrir. Si le contenu est des données binaires avec image - vous sélectionnez la vue comme image. L'exemple ci-dessous montre l'ouverture d'une image ):Visualiseurs de grille de résultats SSMS

Andrei Rantsevich
la source
2
Cela ressemble à une extension vraiment utile, mais je ne peux pas l'accepter comme une réponse car elle nécessite un produit commercial (ou un essai). Merci quand même!
NickG
4
+1 Belle extension gratuite qui fonctionne parfaitement ... Merci!
répété
2
Merci, cela fait exactement ce que je veux.
Derreck Dean
9
Malheureusement, depuis le 4 septembre 2017, SSMS Boost n'est plus gratuit (à l'exception d'un essai de 30 jours pour chaque nouvelle version publiée)
csrowell
4
Il s'agit maintenant d'un produit commercial, la licence gratuite ne couvre aucune des fonctionnalités mentionnées, elles sont désactivées et vous obtenez une fenêtre contextuelle pour acheter la version PRO. La réponse est juste une promotion pour son logiciel.
metabuddy
3

Renvoyer les données au format XML

SELECT CONVERT(XML, [Data]) AS [Value]
FROM [dbo].[FormData]
WHERE [UID] LIKE '{my-uid}'

Assurez-vous de définir une limite raisonnable dans la fenêtre d'options SSMS, en fonction du résultat attendu. entrez la description de l'image ici

Cela fonctionnera si le texte que vous renvoyez ne contient pas de caractères non codés comme &au lieu de &amp;cela, la conversion XML échouera.

Renvoyer des données à l'aide de PowerShell

Pour cela, vous aurez besoin du module PowerShell SQL Server installé sur la machine sur laquelle vous exécuterez la commande.

Si vous êtes tous configurés, configurez et exécutez le script suivant:

Invoke-Sqlcmd -Query "SELECT [Data] FROM [dbo].[FormData] WHERE [UID] LIKE '{my-uid}'" -ServerInstance "database-server-name" -Database "database-name" -Username "user" -Password "password" -MaxCharLength 10000000 | Out-File -filePath "C:\db_data.txt"

Assurez-vous de définir le -MaxCharLengthparamètre sur une valeur qui correspond à vos besoins.

dvlsc
la source
1

Alternative 1 : Faites un clic droit pour copier la cellule et la coller dans l'éditeur de texte (avec un peu de chance avec le support utf-8)

Alternative 2 : Faites un clic droit et exportez vers un fichier CSV

Alternative 3 : utilisez la fonction SUBSTRING pour visualiser des parties de la colonne. Exemple:

SELECT SUBSTRING (fileXml, 2200,200) FROM mytable WHERE id = 123456

Don G.
la source
0

Si vous n'avez qu'à le voir, j'ai utilisé ceci:

print cast(dbo.f_functiondeliveringbigformattedtext(seed) as text)

Le résultat final est que j'obtiens des sauts de ligne et tout le contenu de la fenêtre de messages de SMSS. Bien sûr, cela n'autorise qu'une seule cellule - si vous souhaitez créer une seule cellule à partir d'un certain nombre de lignes, vous pouvez le faire:

declare @T varchar(max)=''
select @T=@T
       + isnull(dbo.f_functiondeliveringbigformattedtext(x.a),'NOTHINGFOUND!')
       + replicate(char(13),4)
from x -- table containing multiple rows and a value in column a
print @T

J'utilise ceci pour valider les chaînes JSON générées par le code SQL. Trop difficile à lire autrement!

CDenby
la source
-1

Le moyen le plus simple d'afficher rapidement une grande colonne varchar / texte:

declare @t varchar(max)

select @t = long_column from table

print @t
Rafael Lenartowicz
la source
11
Mais le texte est toujours tronqué :-(
Rasmus