web-dev-qa-db-fra.com

Comment afficher le contenu complet d'une colonne text ou varchar (MAX) dans SQL Server 2008 Management Studio?

Dans cette base de données active SQL Server 2008 (version 10.0.1600), il existe une table Events, qui contient une colonne text, nommée Details. (Oui, je réalise que cela devrait en fait être une colonne varchar(MAX), mais celui qui a configuré cette base de données ne l'a pas fait de cette façon.)

Cette colonne contient de très grands journaux d'exceptions et les données JSON associées auxquelles j'essaie d'accéder via SQL Server Management Studio, mais chaque fois que je copie les résultats de la grille dans un éditeur de texte, il est tronqué à 43679 caractères.

J'ai lu à divers endroits sur Internet que vous pouvez définir vos caractères maximum récupérés pour les données XML dans Tools > Options > Query Results > SQL Server > Results To Grid Sur Illimité, puis effectuez une requête telle que celle-ci:

select Convert(xml, Details) from Events
where EventID = 13920

(Notez que la donnée est une colonne n’est pas du tout XML. CONVERTing de la colonne en XML est simplement une solution de contournement que j’ai trouvée dans Google recherchant un tiers qui a utilisé pour contourner la limite imposée par SSMS lors de la récupération de données à partir de text ou varchar(MAX) colonne.)

Cependant, après avoir défini l'option ci-dessus, exécuté la requête et cliqué sur le lien dans le résultat, j'obtiens toujours l'erreur suivante:

Impossible d'afficher XML. L'erreur suivante s'est produite: une fin de fichier inattendue s'est produite. Ligne 5, position 220160.

Une solution consiste à augmenter le nombre de caractères extraits du serveur pour les données XML. Pour modifier ce paramètre, dans le menu Outils, cliquez sur Options.

Donc, toute idée sur la façon d’accéder à ces données? La conversion de la colonne en varchar(MAX) résoudrait-elle mes problèmes?

82
adamjford

Une astuce qui pourrait fonctionner dans des circonstances assez limitées consiste simplement à nommer la colonne de manière spéciale, comme indiqué ci-dessous.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

Dans SSMS 2012 et 2014, les résultats sont présentés ci-dessous.

enter image description here

Un clic dessus ouvre les résultats complets dans la visionneuse XML. Faire défiler vers la droite montre que le dernier caractère de B est conservé,

Cependant, cela pose des problèmes importants. L'ajout de colonnes supplémentaires à la requête annule l'effet et les lignes supplémentaires deviennent toutes concaténées avec la première. Enfin, si la chaîne contient des caractères tels que < l'ouverture du visualiseur XML échoue avec une erreur d'analyse.

Une méthode plus robuste qui évite les problèmes de conversion de SQL Server < à &lt; etc ou échouant à cause de ces caractères est en dessous ( crédit Adam Machanic ici ).

DECLARE @S varchar(max)

SELECT @S = ''

SELECT @S = @S + '
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES

SELECT @S AS [processing-instruction(x)] FOR XML PATH('')
83
Martin Smith

J'ai pu faire en sorte que cela fonctionne ...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
40
Scott Durbin

Une solution consiste à cliquer avec le bouton droit sur le jeu de résultats et à sélectionner "Enregistrer les résultats sous ...". Cela l'exporte dans un fichier CSV avec l'intégralité du contenu de la colonne. Pas parfait mais a assez bien fonctionné pour moi.

Workaround

17
Darky711

Avez-vous essayé cette solution simple? Seulement 2 clics!

À la fenêtre de requête,

  1. définissez les options de requête sur "Résultats sur la grille", exécutez votre requête
  2. Faites un clic droit sur l'onglet de résultats au coin de la grille, enregistrez les résultats sous forme de fichiers.

Vous obtiendrez tout le texte que vous voulez voir dans le fichier !!! Je peux voir 130 556 caractères pour mon résultat d'un champ varchar (MAX)

Results in a file

8
Jenna Leaf

La solution de contournement la plus simple que j'ai trouvée consiste à sauvegarder la table et à afficher le script. Pour faire ça

  1. Faites un clic droit sur votre base de données et choisissez Tasks> Generate Scripts...
  2. Page "Introduction" cliquez Next
  3. "Choisir des objets" page
    1. Choisir la Select specific database objects et sélectionnez votre table.
    2. Cliquez sur Next
  4. Page "Définir les options de script"
    1. Définissez le type de sortie sur Save scripts to a specific location
    2. Sélectionnez Save to file et remplissez les options correspondantes
    3. Cliquez sur le bouton Advanced
    4. Définissez General> Types of data to script à Data only ou Schema and Data et cliquez sur ok
    5. Cliquez sur Next
  5. "Résumé" cliquez sur suivant
  6. Votre script SQL doit être généré en fonction des options définies dans 4.2. Ouvrez ce fichier et affichez vos données.
4
Kevin Brydon

Le type de données TEXT est ancien et ne doit plus être utilisé, il est difficile de sélectionner des données dans une colonne TEXT.

ntext, text et image (Transact-SQL)

les types de données ntext, text et image seront supprimés dans une future version de Microsoft SQL Server. Évitez d'utiliser ces types de données dans les nouveaux travaux de développement et prévoyez de modifier les applications qui les utilisent actuellement. Utilisez plutôt nvarchar (max), varchar (max) et varbinary (max).

vous devez utiliser TEXTPTR (Transact-SQL) pour extraire les données texte.

Voir également cet article sur Traitement du type de données texte .

3
KM.

Il semble que le XML ne soit pas bien formé. Si tel est le cas, vous ne pourrez pas le convertir au format XML et, dans ces conditions, vous aurez une quantité limitée de texte pouvant être renvoyé dans Management Studio. Cependant, vous pouvez diviser le texte en morceaux plus petits, comme ceci:

With Tally As
    (
        Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num
        From sys.sysobjects As s1
            Cross Join sys.sysobjects As s2
    )
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000)
From Table As T1
    Cross Join Tally As T2
Where T2.Num <= Ceiling(Len(T1.textCol) / 8000)
Order By T2.Num

Vous devrez alors les combiner manuellement à nouveau.

EDIT

On dirait qu'il y a des caractères dans les données text que l'analyseur Xml n'aime pas. Vous pouvez essayer de convertir ces valeurs en entités, puis essayez l’astuce Convert(xml, data). Donc, quelque chose comme:

Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;')

(J'avais besoin de transtyper en varchar (max) car la fonction de remplacement ne fonctionnera pas sur les colonnes text. Il ne devrait y avoir aucune raison pour laquelle vous ne pouviez pas convertir ces colonnes text en varchar(max).)

2
Thomas

Vous n'avez pas de chance, je pense. Le problème n'est pas un problème de niveau SQL comme toutes les autres réponses semblent se focaliser dessus, mais simplement une des interfaces utilisateur. Management Studio n'est pas conçu pour être une interface d'accès aux données générique ou à usage général. Ce n'est pas là votre interface, mais votre zone administrative, et elle a de sérieuses limitations pour la gestion des données binaires et des données de test volumineuses, car les personnes l'utilisant dans le profil d'utilisation spécifié ne rencontreront pas ce problème.

La présentation de données textuelles volumineuses n’est tout simplement pas l’utilisation prévue.

Votre seul choix serait une fonction table qui prend l’entrée de texte et la découpe pour chaque ligne, de sorte que Management Studio obtienne une liste de lignes et non une seule ligne.

0
TomTom

À partir de SSMS 18.2, vous pouvez maintenant afficher jusqu'à 2 millions de caractères dans les résultats de la grille. Source

Autoriser l'affichage de davantage de données (Résultat en texte) et leur stockage dans des cellules (Résultat en grille). SSMS autorise maintenant jusqu'à 2M caractères pour les deux.

J'ai vérifié cela avec le code ci-dessous.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,2000000) + 'B' 

SELECT @S as a
0
Gabe

Je préfère ce hack XML simple qui rend les colonnes cliquables dans SSMS cellule par cellule. Avec cette méthode, vous pouvez visualiser rapidement vos données dans la vue tabulaire de SSMS et cliquer sur des cellules particulières pour voir la valeur complète quand elles sont intéressantes. Ceci est identique à la technique de l'OP, à ceci près qu'il évite les erreurs XML.

SELECT
     e.EventID
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;
0
binki