web-dev-qa-db-fra.com

Troncature SQL Server et limitation de 8192

Dans SQL Server 2005, j'essaie d'interroger une colonne varchar (MAX) contenant des lignes contenant des données textuelles dépassant 8192. Pourtant, dans Management Studio, j'ai sous Outils -> Options -> Résultats de la requête -> Résultats en texte -> Nombre maximal de caractères affichés dans chaque colonne = 8192 , ce qui est un maximum. En conséquence, il semble que la troncature de ces lignes ne se produise qu'en raison de la limitation imposée par la sortie de texte. 

La seule chose que je vois pour contourner cela est d’utiliser une fonction SUBSTRING pour saisir les 8 000 premiers caractères, puis les 8 000 suivants, etc. Mais c’est moche et sujet aux erreurs.

Je devrais mentionner que SSIS et BCP ne sont pas des options pour moi.

Quelqu'un a-t-il une meilleure suggestion? Merci!

43
Ash Machine

Vous pouvez exporter les données dans un fichier à plat qui ne sera pas tronqué. Pour faire ça:

  1. Clic droit sur la base de données
  2. Cliquez sur Tâches -> Exporter des données
  3. Sélectionnez votre source de données (les valeurs par défaut devraient être correctes)
  4. Choisissez "Destination de fichier plat" pour le type de destination.
  5. Choisissez un nom de fichier pour la sortie.
  6. Sous "Spécifier une copie ou une requête de table", choisissez "Écrire une requête pour spécifier les données à transférer"
  7. Coller dans votre requête

Les étapes restantes doivent être explicites. Cela créera le fichier en texte et vous pourrez l'ouvrir dans votre éditeur de texte favori.

64
Torre Lasley

J'utilise aussi XML mais une méthode légèrement différente qui résout la plupart des problèmes liés à l'habilitation XML.

declare @VeryLongText nvarchar(max) = '';

SELECT top 100 @VeryLongText = @VeryLongText + '

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1

SELECT LEN(@VeryLongText)

SELECT @VeryLongText AS [processing-instruction(x)] FOR XML PATH('')

PRINT @VeryLongText /*WILL be truncated*/

Assurez-vous que la limite de "données XML" dans SSMS est suffisamment élevée!

Screenshot

27
Martin Smith

Je me suis précipité pour essayer d'exporter XML. C'est la solution que j'ai utilisée:

Sélectionnez l'option Résultat dans la grille, cliquez avec le bouton droit sur le lien qui apparaît dans le volet Résultats, puis sélectionnez Enregistrer les résultats sous, choisissez le type de fichier Tous les fichiers, nommez le fichier, puis cliquez sur Enregistrer. Toutes les données XML sont enregistrées correctement dans un fichier.

J'utilise SSMS 10 et je ne pouvais pas utiliser la solution de Torre. L'assistant d'exportation pensait que la colonne d'entrée était une image:

Le type de données pour la "colonne d'entrée" XML_F52E2B61-18A1-11d1-B105-00805F49916B "(26)" est DT_IMAGE

4
Cindy Conway

Ma solution était un peu détournée mais m'a amené là (tant que la sortie contient moins de 65 535 caractères):

  1. Dans SQL Management Studio, définissez la limite des résultats de la grille sur 65535 (Outils> Options> Résultats de la requête> SQL Server> Résultats sur Grille> Données non XML).
  2. Exécuter la requête, sortie dans la grille
  3. Cliquez avec le bouton droit sur les résultats, choisissez "Enregistrer les résultats sous ..." et enregistrez les résultats dans un fichier.
  4. Ouvrez le fichier dans le bloc-notes ou similaire pour obtenir le résultat.

UPDATE: Pour démontrer que cela fonctionne, voici un exemple de code SQL sélectionnant une seule colonne de 100 000 caractères. Si je sauvegarde la sortie de la grille dans un fichier csv, tous les 100 000 caractères y sont présents sans aucune troncature.

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100)
SET @test = ''; SET @i = 100
WHILE @i < 100000
BEGIN
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar))
    SET @i = @i + 100
END
SELECT @test

Remarques:

  1. Le réglage de la longueur de caractère ne semble pas faire de différence, comme je le pensais à l'origine.
  2. J'utilise SQL 2008 R2 (le serveur et Management Studio)
  3. Cela ne semble pas faire de différence si la colonne longue est stockée dans une variable locale (comme dans cet exemple) ou sélectionnée dans une table réelle.
4
Luke Sampson

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)

 Just Two Clicks away!

3
Jenna Leaf

J'utilise généralement XML pour obtenir une chaîne de débogage énorme en sortie (en utilisant le test de Luke):

    declare @test nvarchar(max), @i int, @line nvarchar(100)
    set @test = ''; set @i = 100
    while @i < 100000
    begin
        set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar))
        set @i = @i + 100
    end
    -- ctrl+d for "results to grid" then click the xml output
    --select cast('<root>' + @test + '</root>' as xml)

-- revised
select @test for xml path(''), type;
0
Nathan Skerl

Si je pouvais choisir, la requête renverrait les données sous la forme "Pour XML Auto" ou "Pour XML brut" ou "Pour XML explicite". Ainsi, les limites sont beaucoup plus élevées et vous pouvez faire beaucoup plus avec les résultats affichés.

0
Avitus

Dans SSMS, si vous sélectionnez des données à partir d'une ligne, le nombre de caractères est limité, mais si vous modifiez des données à partir d'une ligne, la valeur complète sera présente. Il n’est peut-être pas toujours là, mais si vous ctrl-a, ctrl-c, passez-le dans un éditeur, tout sera là.

0
Larry K

Une autre solution, utilisez HeidiSql pour ces requêtes délicates. Il n’a pas de limites dans la longueur du champ.

0
cpsaez

La troncature dont vous parlez ne se produit que dans Management Studio. Si vous tirez la colonne dans une autre application, elle ne sera pas tronquée.

Vous ne pouvez pas utiliser Query Analyzer pour parler à SQL Server 2005. Voulez-vous dire Management Studio?

0
Joel Coehoorn