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

Dans cette base de données LIVE SQL Server 2008 (build 10.0.1600), il y a une table Events, qui contient une colonne text nommée Details. (Oui, je me rends compte que cela devrait en fait être une colonne varchar(MAX), mais celui qui a mis en place cette base de données ne l'a pas fait de cette façon.)

Cette colonne contient de très gros journaux d'exceptions et de données JSON associées auxquels 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 les tronque à 43679 caractère.

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

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

(notez que la colonne data is n'est pas du tout XML. CONVERT ing la colonne en XML est simplement une solution de contournement que j'ai trouvée en Googlant que quelqu'un d'autre a utilisé pour contourner la limite que SSMS a de la récupération des données d'une colonne text ou varchar(MAX).)

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

Impossible d'afficher XML. L'erreur suivante s'est passé: La fin inattendue du fichier s'est produite. Ligne 5, position 220160.

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

Donc, aucune idée sur la façon d'accéder à ces données? convertirait-il le colonne à varchar(MAX) réparer mes malheurs?

75
demandé sur adamjford 2010-05-03 20:58:44

9 réponses

Une astuce qui pourrait fonctionner dans des circonstances assez limitées est simplement de nommer la colonne d'une manière spéciale comme 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, cela affiche les résultats ci-dessous

entrez la description de l'image ici

Cliquer dessus ouvre les résultats complets dans la visionneuse XML. Le défilement 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 interrompt l'effet et les lignes supplémentaires devenir concaténé avec le premier. Enfin, si la chaîne contient des caractères tels que <, l'ouverture du visualiseur XML échoue avec une erreur d'analyse.

Une façon plus robuste de le faire qui évite les problèmes de conversion de SQL Server < en &lt; etc ou d'échec en raison de ces caractères est ci-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('')
77
répondu Martin Smith 2018-02-20 21:56:15

J'ai pu faire fonctionner ça...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
30
répondu Scott Durbin 2016-04-01 17:20:45

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 tout le contenu de la colonne. Pas parfait mais a fonctionné assez bien pour moi.

Contournement

11
répondu Darky711 2017-03-08 19:45:50

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

Dans la fenêtre de requête,

  1. définissez les options de requête sur "Résultats en grille", exécutez votre requête
  2. Faites un clic droit sur l'onglet résultats dans le coin de la grille, enregistrez les résultats sous n'importe quel fichier

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

Résultats dans un fichier

5
répondu Jenna Leaf 2017-12-05 22:49:22

La solution de contournement la plus simple que j'ai trouvée est de sauvegarder la table et d'afficher le script. Pour ce faire

  1. faites un clic droit sur votre base de données et choisissez Tasks > Generate Scripts...
  2. Page" Introduction " cliquez sur Next
  3. page "choisir des objets"
    1. Choisir le 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 associées
    3. Cliquez le bouton Advanced
    4. ensemble General > Types of data to script pour Data only ou {[11] } et cliquez sur ok
    5. cliquez sur Next
  5. " Page de Résumé " cliquez sur Suivant
  6. votre script sql doit être généré en fonction des options que vous avez définies dans 4.2. Ouvrez ce fichier et affichez vos données.
4
répondu Kevin Brydon 2014-03-13 14:46:03

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 de texte.

Ntext, texte et image (Transact-SQL)

Types de données Ntext, text et image sera supprimé dans une future version de Microsoft SQL Server. Évitez d'utiliser des ces types de données dans le nouveau développement travailler et planifier la modification des applications qui les utilisent actuellement. Utiliser nvarchar(max), varchar(max), et varbinary (max) à la place.

Vous besoin d'utiliser TEXTPTR (Transact-SQL) pour récupérer les données de texte.

Voir aussi cet article sur la gestion du type de données textuelles .

3
répondu KM. 2010-05-03 17:21:15

Il semble que le Xml ne soit pas bien formé. Si tel est le cas, vous ne pourrez pas le lancer en Xml et, étant donné que vous êtes limité dans la quantité de texte que vous pouvez retourner dans Management Studio. Cependant, vous pouvez diviser le texte en petits morceaux 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.

Modifier

Il semble qu'il y ait des caractères dans les données text que L'analyseur Xml n'aime pas. Vous pouvez essayer de convertir ces valeurs aux 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 lancer varchar (max) car la fonction replace ne fonctionnera pas sur les colonnes text. Il ne devrait y avoir aucune raison pour que vous ne puissiez pas convertir ces colonnes text en varchar(max).)

2
répondu Thomas 2010-05-03 17:35:31

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 concentrer sur, mais simplement l'une de l'interface utilisateur. Management Studio n'est pas censé être une interface d'accès aux données à usage général / Générique. Il n'est pas là pour être votre interface, mais votre zone administrative, et il a de sérieuses limites à gérer les données binaires et les données de test volumineuses - car les personnes qui l'utilisent dans le profil d'utilisation spécifié ne rencontreront pas ce problème.

Présentation les grandes données de texte ne sont tout simplement pas l'utilisation prévue.

Votre seul choix serait une fonction de valeur de table qui prend la saisie de texte et coupe les lignes pour chaque ligne, de sorte que Management Studio obtient une liste de lignes, pas une seule ligne.

0
répondu TomTom 2010-05-03 17:32:55

Je préfère ce simple hack XML qui rend les colonnes cliquables dans SSMS sur une base cellule par cellule. Avec cette méthode, vous pouvez afficher vos données rapidement dans la vue tabulaire de SSMS et cliquer sur des cellules particulières pour voir la valeur complète lorsqu'elles sont intéressantes. Ceci est identique à la technique de L'OP sauf 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
répondu binki 2016-10-28 15:43:03