Come si visualizza l'intero contenuto di una colonna di testo o varchar (MAX) in SQL Server 2008 Management Studio?


94

In questo database live di SQL Server 2008 (build 10.0.1600), è presente una Eventstabella che contiene una textcolonna denominata Details. (Sì, mi rendo conto che questa dovrebbe effettivamente essere una varchar(MAX)colonna, ma chiunque abbia impostato questo database non l'ha fatto in questo modo.)

Questa colonna contiene registri molto grandi di eccezioni e dati JSON associati a cui sto cercando di accedere tramite SQL Server Management Studio, ma ogni volta che copio i risultati dalla griglia a un editor di testo, li tronca a 43679 caratteri.

Ho letto in varie posizioni su Internet che è possibile impostare il numero massimo di caratteri recuperati per i dati XML Tools > Options > Query Results > SQL Server > Results To Gridsu Illimitato, quindi eseguire una query come questa:

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

(Si noti che i dati nella colonna non sono affatto XML. L' CONVERTinserimento della colonna in XML è semplicemente una soluzione alternativa che ho scoperto da Google che qualcun altro ha utilizzato per aggirare il limite che SSMS ha dal recupero dei dati da una colonna texto varchar(MAX).)

Tuttavia, dopo aver impostato l'opzione sopra, aver eseguito la query e aver fatto clic sul collegamento nel risultato, ricevo ancora il seguente errore:

Impossibile mostrare XML. Si è verificato il seguente errore: si è verificata una fine del file imprevista. Riga 5, posizione 220160.

Una soluzione è aumentare il numero di caratteri recuperati dal server per i dati XML. Per modificare questa impostazione, nel menu Strumenti, fare clic su Opzioni.

Quindi, qualche idea su come accedere a questi dati? Convertire la colonna per varchar(MAX)risolvere i miei guai?

Risposte:


97

SSMS consente solo dati illimitati per i dati XML. Questa non è l'impostazione predefinita e deve essere impostata nelle opzioni.

inserisci qui la descrizione dell'immagine

Un trucco che potrebbe funzionare in circostanze piuttosto limitate è semplicemente nominare la colonna in un modo speciale come di seguito in modo che venga trattata come dati XML.

DECLARE @S varchar(max) = 'A'

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

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

In SSMS (almeno dalle versioni dal 2012 alla 18.3 corrente) vengono visualizzati i risultati come di seguito

inserisci qui la descrizione dell'immagine

Facendo clic su di esso si aprono i risultati completi nel visualizzatore XML. Lo scorrimento verso destra mostra che l'ultimo carattere di B è conservato,

Tuttavia questo ha alcuni problemi significativi. L'aggiunta di colonne extra alla query interrompe l'effetto e le righe extra vengono tutte concatenate con la prima. Infine, se la stringa contiene caratteri come l' <apertura del visualizzatore XML non riesce con un errore di analisi.

Di seguito è riportato un modo più affidabile per eseguire questa operazione che evita problemi di conversione di SQL Server <in &lt;ecc. O errori dovuti a questi caratteri ( credito Adam Machanic qui ).

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('')

2
L'aggiunta di CDATA all'istruzione Convert ha funzionato! Molte grazie. :)
adamjford

L'aggiunta CDATApuò funzionare, ma se i tuoi dati includono caratteri di controllo, devi eseguire un'operazione di sostituzione. Nel mio caso, stavo usando il separatore di unità, codice ASCII 31, all'interno dei miei dati. Dato che stavo usando solo quell'unico personaggio in molti posti, un semplice era REPLACE(details, char(31), '&x1f;')sufficiente. Se avessi avuto caratteri sconosciuti o un numero elevato di caratteri diversi da sostituire, potrei aver dovuto trovare un'altra soluzione.
Zarepheth

@Zarepheth - La CDATAcosa è stata il mio primo suggerimento. L' AS [processing-instruction(x)]ultimo di lo evita.
Martin Smith

1
@MartinSmith ottima risposta! Mi chiedo quanto imparo dalle tue risposte! +1
Kin Shah

50

Sono riuscito a farlo funzionare ...

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

25

Una soluzione consiste nel fare clic con il pulsante destro del mouse sul set di risultati e selezionare "Salva risultati con nome ...". Questo lo esporta in un file CSV con l'intero contenuto della colonna. Non perfetto ma ha funzionato abbastanza bene per me.

Soluzione


10

Hai provato questa semplice soluzione? Solo 2 clic di distanza!

Nella finestra della query,

  1. imposta le opzioni della query su "Risultati su griglia", esegui la query
  2. Fare clic con il tasto destro sulla scheda dei risultati nell'angolo della griglia, salvare i risultati come qualsiasi file

Otterrai tutto il testo che vuoi vedere nel file !!! Posso vedere 130.556 caratteri per il mio risultato di un campo varchar (MAX)

Risultati in un file


1
Dritto - facile - e sempre dimenticato fino a quando non ne avrai bisogno di nuovo :)
Dimi Takis

5

La soluzione più semplice che ho trovato è eseguire il backup della tabella e visualizzare lo script. Per fare questo

  1. Fare clic con il pulsante destro del mouse sul database e scegliere Tasks>Generate Scripts...
  2. Clic sulla pagina "Introduzione" Next
  3. Pagina "Scegli oggetti"
    1. Scegli Select specific database objectse seleziona il tuo tavolo.
    2. Clic Next
  4. Pagina "Imposta opzioni di scripting"
    1. Imposta il tipo di output su Save scripts to a specific location
    2. Seleziona Save to filee compila le relative opzioni
    3. Fare clic sul Advancedpulsante
    4. Imposta General> Types of data to scriptsu Data onlyo Schema and Datae fai clic su OK
    5. Clic Next
  5. "Pagina di riepilogo" fare clic su Avanti
  6. Il tuo script sql dovrebbe essere generato in base alle opzioni impostate in 4.2. Apri questo file e visualizza i tuoi dati.

3

Il tipo di dati TEXT è vecchio e non dovrebbe essere più utilizzato, è un problema selezionare i dati da una colonna TEXT.

ntext, testo e immagine (Transact-SQL)

I tipi di dati ntext, text e image verranno rimossi in una versione futura di Microsoft SQL Server. Evita di utilizzare questi tipi di dati nel nuovo lavoro di sviluppo e pianifica di modificare le applicazioni che li utilizzano attualmente. Utilizza invece nvarchar (max), varchar (max) e varbinary (max).

è necessario utilizzare TEXTPTR (Transact-SQL) per recuperare i dati di testo.

Vedi anche questo articolo sulla gestione del tipo di dati di testo .


La conversione della colonna varchar(MAX)impedirà a SSMS di troncare i dati da essa?
adamjford

Vorrei prima utilizzare SSMS per generare lo script per convertire la colonna TEXT in varchar (max). Da lì puoi valutare se vuoi convertirlo ulteriormente in una colonna XML. Per quanto riguarda i limiti di visualizzazione di SSMS, i risultati sulla griglia possono essere impostati per visualizzare fino a 65.535 caratteri di dati non xml per colonna e fino a una quantità illimitata di dati xml (per esempio, le colonne della tabella di tipo XML possono memorizzare solo 2 GB). Mentre i risultati in testo sono limitati a 8192 caratteri per colonna. Per impostare questi limiti massimi predefiniti, vai al menu STRUMENTI (in SSMS), quindi OPZIONI ... quindi RISULTATI DELLA QUERY, quindi SQL SERVER, quindi RISULTATI SU GRIGLIA o RISULTATI SU TESTO.
KM.

3

Sembra che l'Xml potrebbe non essere ben formato. In tal caso, non sarai in grado di trasmetterlo come Xml e, dato ciò, sei limitato nella quantità di testo che puoi restituire in Management Studio. Tuttavia, potresti suddividere il testo in parti più piccole in questo modo:

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

Dovresti quindi combinarli di nuovo manualmente.

MODIFICARE

Sembra che ci siano alcuni caratteri nei textdati che non piacciono al parser Xml. Potresti provare a convertire quei valori in entità e poi provare il Convert(xml, data)trucco. Quindi qualcosa come:

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

(Avevo bisogno di eseguire il cast su varchar (max) perché la funzione di sostituzione non funzionerà sulle textcolonne. Non dovrebbe esserci alcun motivo per cui non potresti convertire quelle textcolonne varchar(max).)


Oh, suppongo di dover menzionare che la colonna non è affatto XML. CONVERTIRE la colonna in XML è solo una soluzione alternativa che ho scoperto da Google che qualcun altro ha utilizzato per aggirare il limite che SSMS ha dal recupero dei dati da una colonna texto varchar(MAX).
adamjford

1
MODIFICA il tuo codice sopra; Con Tally As (Seleziona ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Seleziona sottostringa (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Dalla tua tabella come T1 Incrocio conteggio come T2 Dove T2.Num <= soffitto (lunghezza dati (T1.YourTextCol) / 8000) Ordina per T2.Num
Ian Quigley

L'utilizzo TSQLdi @IanQuigley basato su questa risposta ha funzionato bene per me. Fondamentalmente ho preso i risultati (alla fine sono stati 11 record) e li ho incollati insieme in Blocco note. Ha funzionato perfettamente. È necessario salvare questo script. Avevo un XML lungo e folle che includeva caratteri non validi.
atconway

1

Preferisco questo semplice hack XML che rende le colonne cliccabili in SSMS su base cella per cella. Con questo metodo, puoi visualizzare rapidamente i tuoi dati nella visualizzazione tabulare di SSMS e fare clic su celle particolari per vedere il valore completo quando sono interessanti. Questo è identico alla tecnica dell'OP tranne che evita gli errori 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
;

Nota che alcuni caratteri non sono validi in XML 1.0 ma validi in NVARCHAR/ VARCHAR. Ad esempio, il carattere NUL (diverso da NULLcome valore per il campo). Il cast fallirà per le stringhe con tali valori incorporati.
binki

1

A partire da SSMS 18.2, ora puoi visualizzare fino a 2 milioni di caratteri nei risultati della griglia. fonte

Consenti la visualizzazione di più dati (risultato in testo) e l'archiviazione nelle celle (risultato su griglia). SSMS ora consente fino a 2 milioni di caratteri per entrambi.

L'ho verificato con il codice sottostante.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
Il numero massimo di caratteri è in realtà 2097152 ( nella versione SSMS 15.0.18333.0 ).
stomy

0

Sei sfortunato, credo. Il problema non è un problema di livello SQL come tutte le altre risposte sembrano concentrarsi, ma semplicemente uno dell'interfaccia utente. Management Studio non è pensato per essere un'interfaccia di accesso ai dati per scopi generici / generici. Non è lì per essere la tua interfaccia, ma la tua area amministrativa, e ha serie limitazioni nella gestione dei dati binari e dei dati di test di grandi dimensioni, perché le persone che lo utilizzano all'interno del profilo di utilizzo specificato non si imbatteranno in questo problema.

La presentazione di dati di testo di grandi dimensioni semplicemente non è l'utilizzo pianificato.

La tua unica scelta sarebbe una funzione con valori di tabella che prenda l'input di testo e lo tagli le righe per ogni riga, in modo che Management Studio ottenga un elenco di righe, non una singola riga.


Sento che questa risposta è, nella migliore delle ipotesi, un'ipotesi, o hai qualche fonte per "l'utilizzo pianificato"? Se si tratta di uno "studio di gestione" SQL dovrebbe almeno essere in grado di mostrarmi il contenuto dei miei database. UI assolutamente orribile.
dannato

Questa risposta dovrebbe essere cancellata poiché non è più applicabile
Caius Jard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.