2010-05-03 5 views
71

In questo database di SQL Server 2008 (build 10.0.1600) attivo, esiste una tabella Events, che contiene una colonna denominata Details. (Sì, mi rendo conto che questa dovrebbe essere effettivamente una colonna varchar(MAX), ma chiunque abbia impostato questo database non ha funzionato in questo modo.)Come visualizzare il contenuto completo di una colonna di testo o varchar (MAX) in SQL Server 2008 Management Studio?

Questa colonna contiene registri di eccezioni e dati JSON associati di 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 vari luoghi su Internet che si può impostare il numero massimo di caratteri Estratto per i dati XML in Tools > Options > Query Results > SQL Server > Results To Grid a Unlimited, e quindi eseguire una query come questa:

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

(Si noti che il dati è colonna non è XML a tutti. CONVERT ing la colonna XML è solo una soluzione che ho trovato da Googling che qualcun altro ha usato per aggirare il limite SSMS ha di recuperare i dati da una colonna text o varchar(MAX).)

Tuttavia, dopo aver impostato l'opzione sopra, in esecuzione la query, e cliccando sul link nel risultato, ho ancora ottenere il seguente errore:

Unable to show XML. The following error happened: Unexpected end of file has occurred. Line 5, position 220160.

One solution is to increase the number of characters retrieved from the server for XML data. To change this setting, on the Tools menu, click Options.

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

+0

Ho usato per avere un programma di utilità custom-scritte solo per lo scopo di accedere campi di testo. E 'stato molto fastidioso – Jaxidian

risposta

76

Un trucco che potrebbe funzionare in circostanze abbastanza 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 il 2014 questa visualizza i risultati, come di seguito

enter image description here

Facendo clic su di esso apre i risultati completi nel visualizzatore XML. Scorrendo a destra viene conservato l'ultimo carattere di B,

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

Un modo più efficace per evitare problemi di conversione di SQL Server da < a &lt; ecc. O il mancato funzionamento di questi caratteri è inferiore a (credit Adam Machanic here).

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

Aggiunta di CDATA all'istruzione Convert funzionante! Molte grazie. :) – adamjford

+0

L'aggiunta di 'CDATA' potrebbe funzionare, ma se i dati includono caratteri di controllo, è necessario eseguire un'operazione di sostituzione. Nel mio caso, stavo usando il Separatore unità, codice ASCII 31, all'interno dei miei dati. Dato che stavo usando quel solo carattere in molti posti, era sufficiente un semplice 'REPLACE (dettagli, char (31), '&x1f;'). Se avessi caratteri sconosciuti o un gran numero di caratteri diversi da sostituire, avrei dovuto trovare un'altra soluzione. – Zarepheth

+0

@Zarepheth - La cosa 'CDATA' è stata la mia prima proposta. Il successivo di 'AS [processing-instruction (x)]' lo evita. –

2

Sembra che l'Xml non sia ben formato. Se questo è il caso, non potrai lanciarlo come Xml e dato ciò, sei limitato a quanto testo puoi restituire in Management Studio. Tuttavia, si potrebbe spezzare 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 

Si sarebbe quindi necessario combinare manualmente di nuovo.

EDIT

Sembra che ci sono alcuni personaggi nei dati text che il parser XML non piace. Potresti provare a convertire quei valori in entità e poi provare il trucco Convert(xml, data). Quindi, qualcosa di simile a:

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

(avevo bisogno di lanciare a varchar (max), perché il posto di funzione non funziona su text colonne non ci dovrebbe essere alcun motivo per cui non è possibile convertire quei text colonne per varchar(max)..)

+0

Oh, suppongo che dovrei menzionare che la colonna non è affatto XML. Convertire la colonna in XML è solo una soluzione che ho trovato da Google su Google che qualcun altro ha usato per aggirare il limite che SSMS ha dal recuperare i dati da una colonna 'text' o' varchar (MAX) '. – adamjford

+1

EDIT del codice di cui sopra; Con Tally Come ( Select ROW_NUMBER() OVER (ORDER BY s1.id) - 1 Come Num Da sys.sysobjects come S1 cross join sys.sysobjects Come s2 ) Select substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Da YourTable Come T1 cross join Tally Come T2 Dove T2.Num <= Ceiling (datalength (T1.YourTextCol)/8000) Ordinato per T2.Num –

+0

uso di 'TSQL' da @IanQuigley basato su questa risposta ha funzionato bene per me. Praticamente ho preso i risultati (ho finito per essere 11 record) e li ho appena incollati nel Blocco note. Ha funzionato perfettamente È necessario salvare questo script. Ho avuto qualche pazzo XML lungo che includeva caratteri non validi. – atconway

2

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

ntext, text, and image (Transact-SQL)

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

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

Vedere anche questo articolo su Handling The Text Data Type.

+0

La conversione della colonna in 'varchar (MAX)' impedirà a SSMS di troncare i dati da esso? – adamjford

+0

Per prima cosa utilizzerei SSMS per generare lo script per convertire la colonna TEXT in varchar (max). Da lì è possibile valutare se si desidera ulteriormente convertirlo 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 (fyi, le colonne di tabella di tipo XML possono solo memorizzare 2 GB). Mentre i risultati del testo sono limitati a 8192 caratteri per colonna. Per impostare questi limiti massimi predefiniti, vai al menu STRUMENTI (in SSMS), quindi OPZIONI ... quindi QUERY RISULTATI, quindi SQL SERVER, quindi RISULTATI IN GRIGLIA o RISULTATI IN TESTO. –

0

Sei sfortunato, penso.Il problema non è un problema a livello SQL poiché tutte le altre risposte sembrano focalizzarsi, ma semplicemente un'interfaccia utente. Management Studio non intende essere un'interfaccia di accesso ai dati generici/generici. Non è lì per essere la tua interfaccia, ma la tua area amministrativa, e ha serie limitazioni nel gestire dati binari e 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.

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

L'unica scelta possibile è una funzione valutata a livello di tabella che prende l'input di testo e taglia le righe per ogni riga, in modo che Management Studio ottenga un elenco di righe, non una singola riga.

+0

Mi sento come se questa risposta fosse una supposizione al massimo, o hai qualche fonte per "l'utilizzo pianificato"? Se si tratta di uno "studio di gestione" SQL, dovrebbe per lo meno essere in grado di mostrarmi il contenuto dei miei database. UI assolutamente terribile. – damd

4

La soluzione più semplice che ho trovato è quello di eseguire il backup del tavolo e visualizzare lo script. Per fare questo

  1. Fare clic destro del database e scegliere Tasks>Generate Scripts...
  2. pagina "Introduzione" click Next
  3. "Scegli oggetti" pagina
    1. Scegliere la Select specific database objects e selezionare il proprio tavolo.
    2. Clicca Next
  4. "Imposta opzioni di scripting" pagina
    1. Impostare il tipo di uscita per Save scripts to a specific location
    2. Selezionare Save to file e compila le opzioni relative
    3. Fare clic sul pulsante Advanced
    4. Set General >Types of data to script a Data only o Schema and Data e fare clic su ok
    5. Clicca Next
  5. "Sommario Pagina" 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.
+0

Grazie - ha funzionato bene! – skiphoppy

28

ero in grado di farlo funzionare ...

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

preferisco questo semplice trucco XML che rende colonne cliccabili in SSMS su base cella per cella. Con questo metodo, è possibile visualizzare rapidamente i dati nella visualizzazione tabulare di SSMS e fare clic su celle particolari per visualizzare 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 
; 
6

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.

Workaround

0

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

Alla finestra di query,

  1. opzioni di query impostato su "Risultati alla griglia", eseguire la query
  2. Fare clic destro sulla scheda dei risultati in un angolo della griglia, salvare i risultati come qualsiasi file

Otterrete tutto il testo che volete vedere nel file !!! Posso vedere 130,556 caratteri per il mio risultato di un campo varchar (MAX)

Results in a file