risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come posso visualizzare il contenuto completo di una colonna text o varchar (MAX) in SQL Server 2008 Management Studio?

In questo database live di SQL Server 2008 (build 10.0.1600), esiste una tabella Events, che contiene una colonna text denominata Details. (Sì, mi rendo conto che in realtà dovrebbe trattarsi di una colonna varchar(MAX), ma chiunque abbia impostato questo database non lo ha fatto in questo modo.)

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

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

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

(Nota che i dati sono colonne non sono affatto XML. CONVERTing la colonna in XML è solo una soluzione che ho trovato su Google che qualcuno ha usato per aggirare il limite che SSMS ha dal recupero dei dati da un text o varchar(MAX) colonna.)

Tuttavia, dopo aver impostato l'opzione sopra, eseguendo la query e facendo clic sul collegamento nel risultato, ottengo ancora il seguente errore:

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

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

Quindi, qualche idea su come accedere a questi dati? La conversione della colonna in varchar(MAX) risolverà i miei guai?

82
adamjford

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

DECLARE @S varchar(max) = 'A'

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

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

In SSMS 2012 e 2014 questo mostra i risultati come di seguito

enter image description here

Cliccandoci sopra si aprono i risultati completi nel visualizzatore XML. Scorrendo verso destra mostra l'ultimo carattere di B conservato,

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

Un modo più efficace per farlo che evita problemi di conversione di SQL Server < a &lt; etc o il fallimento a causa di questi caratteri è inferiore ( 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('')
83
Martin Smith

Sono stato in grado di farlo funzionare ...

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

Una soluzione è 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.

Workaround

17
Darky711

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

Nella finestra della query,

  1. impostare le opzioni di query su "Risultati su griglia", eseguire 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 !!! Riesco a vedere 130.556 caratteri per il mio risultato di un campo varchar (MAX)

Results in a file

8
Jenna Leaf

La soluzione più semplice che ho trovato è il backup della tabella e la visualizzazione dello script. Per farlo

  1. Fai clic con il pulsante destro del mouse sul database e scegli Tasks> Generate Scripts...
  2. Pagina "Introduzione" fare clic su Next
  3. Pagina "Scegli oggetti"
    1. Scegli il Select specific database objects e seleziona la tua tabella.
    2. Fai clic su Next
  4. Pagina "Imposta opzioni di scripting"
    1. Imposta il tipo di output su Save scripts to a specific location
    2. Seleziona Save to file e compila le relative opzioni
    3. Fai clic sul pulsante Advanced
    4. Imposta General> Types of data to script a Data only o Schema and Data e fai clic su OK
    5. Fai clic su Next
  5. "Pagina di riepilogo" fare clic su Avanti
  6. Lo script sql dovrebbe essere generato in base alle opzioni impostate in 4.2. Apri questo file e visualizza i tuoi dati.
4
Kevin Brydon

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

ntext, text e image (Transact-SQL)

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

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

Vedi anche questo articolo su Gestione del tipo di dati di testo .

3
KM.

Sembra che l'Xml potrebbe non essere ben formato. In tal caso, non sarai in grado di lanciarlo come Xml e, dato questo, sei limitato a quanto testo puoi restituire in Management Studio. Tuttavia, è possibile suddividere il testo in blocchi più piccoli 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 nuovamente manualmente.

[~ ~ #] modifica [~ ~ #]

Sembra che ci siano alcuni caratteri nei dati text che al parser Xml non piacciono. Potresti provare a convertire quei valori in entità e quindi provare il trucco Convert(xml, data). 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à su text colonne. Non ci dovrebbero essere motivi per cui non puoi convertire quelle text colonne in varchar(max).)

2
Thomas

Sei sfortunato, penso. Il problema non è un problema di livello SQL poiché tutte le altre risposte sembrano focalizzarsi, ma semplicemente una delle interfacce utente. Management Studio non intende essere un'interfaccia di accesso ai dati generica/generica. Non esiste la tua interfaccia, ma la tua area amministrativa, e ha serie limitazioni nella gestione di dati binari e dati di test di grandi dimensioni, perché le persone che lo utilizzano all'interno del profilo di utilizzo specificato non incontreranno questo problema.

Presentare dati di testo di grandi dimensioni non è semplicemente l'uso pianificato.

L'unica scelta sarebbe una funzione con valori di tabella che accetta l'input di testo e lo taglia per ogni riga, in modo che Management Studio ottenga un elenco di righe, non una singola riga.

0
TomTom

A partire da SSMS 18.2, ora è possibile visualizzare fino a 2 milioni di caratteri nei risultati della griglia. Source

Consentire la visualizzazione di più dati (Risultato su testo) e la memorizzazione in celle (Risultato su griglia). SSMS ora consente fino a 2 milioni di caratteri per entrambi.

Ho verificato questo con il codice qui sotto.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a
0
Gabe

Preferisco questo semplice hack XML che rende le colonne selezionabili in SSMS cella per cella. Con questo metodo, puoi visualizzare rapidamente i tuoi dati nella vista tabulare di SSMS e fare clic su celle particolari per vedere il valore completo quando sono interessanti. Ciò è identico alla tecnica del PO, tranne per il fatto 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
;
0
binki