Wie kann ich den vollständigen Inhalt einer Text- oder Varchar-Spalte (MAX) in SQL Server 2008 Management Studio anzeigen?

94

In dieser Live-Datenbank von SQL Server 2008 (Build 10.0.1600) befindet sich eine EventsTabelle, die eine textSpalte mit dem Namen enthältDetails . (Ja, mir ist klar, dass dies eigentlich eine varchar(MAX)Spalte sein sollte, aber wer auch immer diese Datenbank eingerichtet hat, hat es nicht so gemacht.)

Diese Spalte enthält sehr große Protokolle mit Ausnahmen und zugehörigen JSON-Daten, auf die ich über SQL Server Management Studio zugreifen möchte. Wenn ich jedoch die Ergebnisse aus dem Raster in einen Texteditor kopiere, werden sie mit 43679 Zeichen abgeschnitten.

Ich habe an verschiedenen Stellen im Internet gelesen, dass Sie Ihre für XML-Daten abgerufenen maximalen Zeichen Tools > Options > Query Results > SQL Server > Results To Gridauf Unbegrenzt setzen und dann eine Abfrage wie die folgende ausführen können:

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

(Beachten Sie, dass die Spalte "Daten" überhaupt nicht XML ist. CONVERTDas Spalten der Spalte in XML ist lediglich eine Problemumgehung, die ich beim Googeln gefunden habe und die jemand anderes verwendet hat, um die Grenze zu umgehen, die SSMS beim Abrufen von Daten aus a hattext oder einer varchar(MAX)Spalte hat.)

Nachdem ich die obige Option festgelegt, die Abfrage ausgeführt und auf den Link im Ergebnis geklickt habe, wird weiterhin der folgende Fehler angezeigt:

XML kann nicht angezeigt werden. Der folgende Fehler ist aufgetreten: Unerwartetes Dateiende ist aufgetreten. Zeile 5, Position 220160.

Eine Lösung besteht darin, die Anzahl der vom Server für XML-Daten abgerufenen Zeichen zu erhöhen. Um diese Einstellung zu ändern, klicken Sie im Menü Extras auf Optionen.

Haben Sie eine Idee, wie Sie auf diese Daten zugreifen können? Würde varchar(MAX)ich die Spalte konvertieren, um meine Probleme zu beheben?

Adamjford
quelle

Antworten:

96

SSMS erlaubt nur unbegrenzte Daten für XML-Daten. Dies ist nicht die Standardeinstellung und muss in den Optionen festgelegt werden.

Geben Sie hier die Bildbeschreibung ein

Ein Trick, der unter sehr begrenzten Umständen funktionieren kann, besteht darin, die Spalte einfach wie folgt zu benennen, damit sie als XML-Daten behandelt wird.

DECLARE @S varchar(max) = 'A'

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

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

In SSMS (mindestens Versionen 2012 bis aktuell 18.3) werden die folgenden Ergebnisse angezeigt

Geben Sie hier die Bildbeschreibung ein

Wenn Sie darauf klicken, werden die vollständigen Ergebnisse im XML-Viewer geöffnet. Ein Bildlauf nach rechts zeigt, dass das letzte Zeichen von B erhalten bleibt.

Dies hat jedoch einige signifikante Probleme. Das Hinzufügen zusätzlicher Spalten zur Abfrage unterbricht den Effekt und zusätzliche Zeilen werden mit der ersten verknüpft. Schließlich, wenn die Zeichenfolge Zeichen wie enthält< Öffnen des XML-Viewers enthält, schlägt der Analysefehler fehl.

Eine robustere Methode, mit der Probleme bei der Konvertierung von SQL Server <in &lt;usw. vermieden werden oder die aufgrund dieser Zeichen fehlschlagen, finden Sie weiter unten ( siehe Adam Machanic hier ).

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
quelle
2
Das Hinzufügen von CDATA zur Convert-Anweisung hat funktioniert! Vielen Dank. :)
Adamjford
Das Hinzufügen CDATAfunktioniert möglicherweise, aber wenn Ihre Daten Steuerzeichen enthalten, müssen Sie einen Ersetzungsvorgang ausführen. In meinem Fall habe ich den Einheitentrenner ASCII-Code 31 in meinen Daten verwendet. Da ich an vielen Stellen nur dieses eine Zeichen benutzte, REPLACE(details, char(31), '&x1f;')genügte ein einfaches . Wenn ich unbekannte Zeichen oder eine große Anzahl verschiedener Zeichen ersetzen musste, musste ich möglicherweise eine andere Lösung finden.
Zarepheth
@ Zarepheth - Das CDATADing war mein erster Vorschlag. Der spätere AS [processing-instruction(x)]vermeidet das.
Martin Smith
1
@ MartinSmith ausgezeichnete Antwort! Ich frage mich, wie viel ich aus Ihren Antworten lerne! +1
Kin Shah
50

Ich konnte das zum Laufen bringen ...

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

Eine Problemumgehung besteht darin, mit der rechten Maustaste auf die Ergebnismenge zu klicken und "Ergebnisse speichern unter ..." auszuwählen. Dadurch wird es in eine CSV-Datei mit dem gesamten Inhalt der Spalte exportiert. Nicht perfekt, aber gut genug für mich funktioniert.

Problemumgehung

Darky711
quelle
9

Haben Sie diese einfache Lösung ausprobiert? Nur 2 Klicks entfernt!

Im Abfragefenster

  1. Setzen Sie die Abfrageoptionen auf "Ergebnisse in Raster" und führen Sie Ihre Abfrage aus
  2. Klicken Sie mit der rechten Maustaste auf die Registerkarte Ergebnisse in der Rasterecke und speichern Sie die Ergebnisse als beliebige Dateien

Sie erhalten den gesamten Text, den Sie in der Datei sehen möchten !!! Ich kann 130.556 Zeichen für mein Ergebnis eines Varchar (MAX) -Felds sehen

Ergebnisse in einer Datei

Jenna Leaf
quelle
1
Gerade - einfach - und immer vergessen, bis Sie es wieder brauchen :)
Dimi Takis
5

Die einfachste Problemumgehung besteht darin, die Tabelle zu sichern und das Skript anzuzeigen. Um dies zu tun

  1. Klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie Tasks>Generate Scripts...
  2. Klicken Sie auf die Seite "Einführung" Next
  3. Seite "Objekte auswählen"
    1. Wählen Sie die Select specific database objectsund wählen Sie Ihre Tabelle.
    2. Klicken Next
  4. Seite "Skriptoptionen festlegen"
    1. Stellen Sie den Ausgabetyp auf ein Save scripts to a specific location
    2. Wählen Sie Save to filedie entsprechenden Optionen aus und füllen Sie sie aus
    3. Klicken Sie auf die AdvancedSchaltfläche
    4. Stellen Sie General> Types of data to scriptauf Data onlyoder ein Schema and Dataund klicken Sie auf OK
    5. Klicken Next
  5. "Zusammenfassungsseite" klicken Sie auf Weiter
  6. Ihr SQL-Skript sollte basierend auf den in 4.2 festgelegten Optionen generiert werden. Öffnen Sie diese Datei und zeigen Sie Ihre Daten an.
Kevin Brydon
quelle
3

Der Datentyp TEXT ist alt und sollte nicht mehr verwendet werden. Es ist schwierig, Daten aus einer TEXT-Spalte auszuwählen.

Text, Text und Bild (Transact-SQL)

Die Datentypen ntext, text und image werden in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Datentypen in neuen Entwicklungsarbeiten und planen Sie, Anwendungen zu ändern, die sie derzeit verwenden. Verwenden Sie stattdessen nvarchar (max), varchar (max) und varbinary (max).

Sie müssen TEXTPTR (Transact-SQL) verwenden , um die Textdaten abzurufen.

Lesen Sie auch diesen Artikel zum Umgang mit dem Textdatentyp .

KM.
quelle
Wird die Spalte konvertiert, varchar(MAX)um zu verhindern , dass SSMS die Daten abschneidet?
Adamjford
Ich würde zuerst SSMS verwenden, um den Scrip zu generieren, um Ihre TEXT-Spalte in varchar (max) zu konvertieren. Von dort aus können Sie auswerten, ob Sie es weiter in eine XML-Spalte konvertieren möchten. In Bezug auf SSMS-Anzeigegrenzen können die Ergebnisse für das Raster so eingestellt werden, dass bis zu 65.535 Zeichen Nicht-XML-Daten pro Spalte und bis zu einer unbegrenzten Menge von XML-Daten angezeigt werden (zu Ihrer Information, Tabellenspalten vom XML-Typ können nur 2 GB speichern). Die Ergebnisse für Text sind auf 8192 Zeichen pro Spalte begrenzt. Um diese Standard-Maximalgrenzen festzulegen, gehen Sie einfach zum Menü (im SSMS) TOOLS, dann zu OPTIONEN ..., dann zu QUERY RESULTS, dann zu SQL SERVER, dann zu RESULTS TO GRID oder RESULTS TO TEXT.
KM.
3

Es hört sich so an, als ob die XML-Datei möglicherweise nicht gut geformt ist. Wenn dies der Fall ist, können Sie es nicht als XML umwandeln. Angesichts dessen ist die Anzahl der Texte, die Sie in Management Studio zurückgeben können, begrenzt. Sie können den Text jedoch wie folgt in kleinere Teile aufteilen:

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

Sie müssten sie dann erneut manuell kombinieren.

BEARBEITEN

Es hört sich so an, als ob die textDaten einige Zeichen enthalten, die dem XML-Parser nicht gefallen. Sie können versuchen, diese Werte in Entitäten zu konvertieren, und dann den Convert(xml, data)Trick ausprobieren . Also so etwas wie:

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

(Ich musste in varchar (max) umwandeln, da die Ersetzungsfunktion für textSpalten nicht funktioniert . Es sollte keinen Grund geben, warum Sie diese textSpalten nicht konvertieren konnten varchar(max).)

Thomas
quelle
Oh, ich denke, ich sollte erwähnen, dass die Spalte überhaupt nicht XML ist. Das Konvertieren der Spalte in XML ist lediglich eine Problemumgehung, die ich beim Googeln gefunden habe und die jemand anderes verwendet hat, um die Grenze zu umgehen, die SSMS beim Abrufen von Daten aus einer textoder einer varchar(MAX)Spalte hat.
Adamjford
1
BEARBEITEN Sie Ihren Code oben: Mit Tally As (Wählen Sie ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Wählen Sie Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Von YourTable As T1 Cross Join Tally As T2 Wobei T2.Num <= Decke (Datenlänge (T1.YourTextCol) / 8000) Bestellung von T2.Num
Ian Quigley
Die Verwendung von TSQLfrom @IanQuigley basierend auf dieser Antwort hat für mich gut funktioniert. Ich habe im Grunde genommen die Ergebnisse (am Ende waren es 11 Datensätze) genommen und sie einfach im Editor zusammengefügt. Hat perfekt funktioniert. Müssen Sie dieses Skript speichern. Ich hatte einige verrückte lange XML-Dateien, die ungültige Zeichen enthielten.
Atconway
1

Ich bevorzuge diesen einfachen XML-Hack, mit dem Spalten in SSMS zellenweise angeklickt werden können. Mit dieser Methode können Sie Ihre Daten schnell in der tabellarischen Ansicht von SSMS anzeigen und auf bestimmte Zellen klicken, um den vollständigen Wert anzuzeigen, wenn sie interessant sind. Dies ist identisch mit der OP-Technik, außer dass die XML-Fehler vermieden werden.

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
quelle
Beachten Sie, dass einige Zeichen in XML 1.0 ungültig, in NVARCHAR/ jedoch gültig sind VARCHAR. Zum Beispiel das NUL-Zeichen (anders NULLals als Wert für das Feld). Die Umwandlung schlägt für Zeichenfolgen mit solchen eingebetteten Werten fehl.
Binki
1

Ab SSMS 18.2 können Sie jetzt bis zu 2 Millionen Zeichen in den Rasterergebnissen anzeigen. Quelle

Ermöglichen, dass weitere Daten angezeigt (Ergebnis zu Text) und in Zellen gespeichert werden (Ergebnis zu Raster). SSMS erlaubt jetzt bis zu 2 Millionen Zeichen für beide.

Ich habe dies mit dem folgenden Code überprüft.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a
Gabe
quelle
1
Die Maximale Zeichenzahl ist tatsächlich 2097152 ( in SSMS Version 15.0.18333.0 ).
Stomy
0

Du hast kein Glück, denke ich. Das Problem ist kein Problem auf SQL-Ebene, da sich alle anderen Antworten auf etwas zu konzentrieren scheinen, sondern lediglich eine der Benutzeroberflächen. Management Studio ist nicht als allgemeine / allgemeine Datenzugriffsschnittstelle gedacht. Es ist nicht dazu da, Ihre Schnittstelle zu sein, sondern Ihr Verwaltungsbereich, und es gibt schwerwiegende Einschränkungen beim Umgang mit Binärdaten und großen Testdaten, da Personen, die es innerhalb des angegebenen Nutzungsprofils verwenden, nicht auf dieses Problem stoßen.

Das Präsentieren großer Textdaten ist einfach nicht die geplante Verwendung.

Ihre einzige Wahl wäre eine Tabellenwertfunktion, die die Texteingabe übernimmt und sie für jede Zeile in Zeilen schneidet, sodass Management Studio eine Liste von Zeilen erhält, nicht eine einzelne Zeile.

TomTom
quelle
Ich denke, diese Antwort ist bestenfalls eine Vermutung, oder haben Sie Quellen für die "geplante Verwendung"? Wenn es sich um ein SQL "Management Studio" handelt, sollte es mir zumindest den Inhalt meiner Datenbanken anzeigen können. Absolut schreckliche Benutzeroberfläche.
Verdammter
Diese Antwort sollte gelöscht werden, da sie nicht mehr gilt
Caius Jard