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

94

Dans cette base de données SQL Server 2008 (build 10.0.1600) en direct, il y a une Eventstable, qui contient une textcolonne nommée Details. (Oui, je réalise que cela devrait en fait être une varchar(MAX)colonne, mais celui qui a créé 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 des 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 les tronque à 43679 caractères.

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

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

(Notez que les données sont une colonne n'est pas du tout XML. La CONVERTconversion de la colonne en XML est simplement une solution de contournement que j'ai trouvée sur Google et que quelqu'un d'autre a utilisée pour contourner la limite que SSMS a de récupérer des données à partir d'une colonne textou varchar(MAX).)

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 le 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 récupérés sur le serveur pour les données XML. Pour modifier ce paramètre, dans le menu Outils, cliquez sur Options.

Alors, une idée sur la façon d'accéder à ces données? Est-ce que convertir la colonne pour varchar(MAX)résoudre mes problèmes?

Adamjford
la source

Réponses:

97

SSMS autorise uniquement des données illimitées pour les données XML. Ce n'est pas la valeur par défaut et doit être défini dans les options.

entrez la description de l'image ici

Une astuce qui pourrait fonctionner dans des circonstances assez limitées consiste simplement à nommer la colonne d'une manière spéciale comme ci-dessous afin qu'elle soit traitée comme des données XML.

DECLARE @S varchar(max) = 'A'

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

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

Dans SSMS (au moins les versions 2012 à la version actuelle de 18.3), les résultats sont affichés ci-dessous

entrez la description de l'image ici

Cliquez dessus pour ouvrir les résultats complets dans le visualiseur 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 rompt l'effet et les lignes supplémentaires sont toutes concaténées avec la première. Enfin, si la chaîne contient des caractères tels que l' <ouverture de la visionneuse XML échoue avec une erreur d'analyse.

Une manière plus robuste de faire cela 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('')
Martin Smith
la source
2
L'ajout de CDATA à l'instruction Convert a fonctionné! Merci beaucoup. :)
adamjford
L'ajout CDATApeut fonctionner, mais si vos données incluent des caractères de contrôle, vous devez effectuer une opération de remplacement. Dans mon cas, j'utilisais le séparateur d'unité, code ASCII 31, dans mes données. Comme je n'utilisais que ce personnage dans de nombreux endroits, un simple REPLACE(details, char(31), '&x1f;')suffisait. Si j'avais des caractères inconnus ou un grand nombre de caractères différents à remplacer, j'aurais peut-être dû trouver une autre solution.
Zarepheth
@Zarepheth - Ce CDATAfut ma première suggestion. Le dernier AS [processing-instruction(x)]évite cela.
Martin Smith
1
@MartinSmith excellente réponse! Je me demande combien j'apprends de vos réponses! +1
Kin Shah
50

J'ai pu faire fonctionner cela ...

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

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 assez bien fonctionné pour moi.

solution de contournement

Darky711
la source
10

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

Dans la fenêtre de requête,

  1. définissez les options de requête sur "Results to Grid", exécutez votre requête
  2. Faites un clic droit sur l'onglet des résultats dans le coin de la grille, enregistrez les résultats sous tous les fichiers

Vous obtiendrez tout le texte que vous souhaitez 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

Feuille de Jenna
la source
1
Hétéro - facile - et toujours oublié jusqu'à ce que vous en ayez à nouveau besoin :)
Dimi Takis
5

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

  1. Faites un clic droit sur votre base de données et choisissez Tasks>Generate Scripts...
  2. Cliquez sur la page "Introduction" Next
  3. Page "Choisir des objets"
    1. Choisissez le Select specific database objectset 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 fileet remplissez les options associées
    3. Cliquez sur le Advancedbouton
    4. Réglez General> Types of data to scriptsur Data onlyou Schema and Dataet 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.
Kevin Brydon
la source
3

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

ntext, texte et image (Transact-SQL)

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

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

Consultez également cet article sur la gestion du type de données texte .

KM.
la source
La conversion de la colonne varchar(MAX)empêchera-t-elle SSMS de tronquer les données de celle-ci?
adamjford
J'utiliserais d'abord SSMS pour générer le script afin de convertir votre colonne TEXT en varchar (max). À partir de là, vous pouvez évaluer si vous souhaitez le convertir davantage en une colonne XML. En ce qui concerne les limites d'affichage SSMS, les résultats à la grille peuvent être définis pour afficher jusqu'à 65 535 caractères de données non xml par colonne et jusqu'à une quantité illimitée de données xml (pour info, les colonnes de table de type XML ne peuvent stocker que 2 Go). Alors que les résultats au texte sont limités à 8192 caractères par colonne. Pour définir ces limites maximales par défaut, allez simplement dans le menu OUTILS (dans SSMS), puis OPTIONS ... puis QUERY RESULTS, puis SQL SERVER, puis RESULTS TO GRID ou RESULTS TO TEXT.
KM.
3

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 ce cas, vous êtes limité dans la quantité de texte que vous pouvez renvoyer 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 à nouveau manuellement.

ÉDITER

Il semble qu'il y ait des caractères dans les textdonnées que l'analyseur XML n'aime pas. Vous pouvez essayer de convertir ces valeurs en entités, puis essayer l' Convert(xml, data)astuce. Donc quelque chose comme:

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

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

Thomas
la source
Oh, je suppose que je devrais mentionner que la colonne n'est pas du tout XML. CONVERTIR la colonne en XML est simplement une solution de contournement que j'ai trouvée sur Google et que quelqu'un d'autre a utilisée pour contourner la limite que SSMS a de récupérer des données à partir d'une colonne textou varchar(MAX).
adamjford
1
EDIT de votre code ci-dessus; Avec Tally As (Select ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Sélectionnez Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) From YourTable As T1 Cross Join Tally As T2 Where T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Order By T2.Num
Ian Quigley
L'utilisation TSQLde @IanQuigley basée sur cette réponse a bien fonctionné pour moi. J'ai essentiellement pris les résultats (au final 11 enregistrements) et je les ai simplement collés ensemble dans le Bloc-notes. A parfaitement fonctionné. Besoin de sauvegarder ce script. J'avais un long XML fou contenant des caractères invalides.
atconway
1

Je préfère ce simple hack XML qui rend les colonnes cliquables dans SSMS 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 que cela é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
;
binki
la source
Notez que certains caractères ne sont pas valides dans XML 1.0 mais valides dans NVARCHAR/ VARCHAR. Par exemple, le caractère NUL (différent de NULLcomme valeur pour le champ). Le cast échouera pour les chaînes avec de telles valeurs incorporées.
binki le
1

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

Autoriser l'affichage de plus de données (résultat vers texte) et leur stockage dans des cellules (résultat vers grille). SSMS autorise désormais jusqu'à 2 millions de 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
Gabe
la source
1
Le nombre maximum de caractères est en fait 2097152 ( dans la version SSMS 15.0.18333.0 ).
stomie le
0

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 une de l'interface utilisateur. Management Studio n'est pas destiné à être une interface d'accès aux données générique / à usage général. Elle n'est pas là pour être votre interface, mais votre zone administrative, et elle présente de sérieuses limitations pour 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.

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

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

TomTom
la source
J'ai l'impression que cette réponse est au mieux une conjecture, ou avez-vous des sources pour «l'utilisation prévue»? S'il s'agit d'un "studio de gestion" SQL, il devrait au moins pouvoir me montrer le contenu de mes bases de données. Interface utilisateur absolument horrible.
damd
Cette réponse doit être supprimée car elle n'est plus applicable
Caius Jard