2010-05-03 16 views
71

W tej żywej bazie danych SQL Server 2008 (kompilacja 10.0.1600) znajduje się tabela Events zawierająca kolumnę text o nazwie Details. (Tak, zdaję sobie sprawę, że w rzeczywistości powinna to być kolumna varchar(MAX), ale ktokolwiek skonfigurował tę bazę danych nie zrobił tego w ten sposób.)Jak wyświetlić pełną zawartość kolumny tekstowej lub varchar (MAX) w programie SQL Server 2008 Management Studio?

Ta kolumna zawiera bardzo duże dzienniki wyjątków i powiązane dane JSON, do których próbuję uzyskać dostęp za pośrednictwem SQL Server Management Studio, ale ilekroć kopiuję wyniki z siatki do edytora tekstowego, przycina się go na 43679 znaków.

Czytałem na różnych miejscach w Internecie, które można ustawić maksymalny Postacie Źródło dla danych XML w Tools > Options > Query Results > SQL Server > Results To Grid do nieograniczonej, a następnie wykonać kwerendę takich jak to:

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

(Należy pamiętać, że danych jest kolumna nie jest XML w ogóle. CONVERT ing kolumny XML jest jedynie obejście znalazłem od Googling, że ktoś użył, aby ominąć limit SSMS ma od pobierania danych z kolumny text lub varchar(MAX).)

Jednak po ustawieniu powyższej opcji działa kwerenda, a kliknięcie na link w wyniku, wciąż pojawia się następujący błąd:

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.

Więc jakiś pomysł, w jaki sposób uzyskać dostęp do tych danych? Czy konwersja kolumny na varchar(MAX) naprawi moje nieszczęścia?

+0

użyłem mieć narzędzia niestandardowe napisany tylko w celu uzyskania dostępu do pól tekstowych. To było bardzo denerwujące. – Jaxidian

Odpowiedz

76

Jedna sztuczka, która może działać w dość ograniczonych okolicznościach, to po prostu nazwanie kolumny w specjalny sposób, jak poniżej.

DECLARE @S varchar(max) = 'A' 

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

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

W SSMS 2012 i 2014 to wyświetla wyniki poniżej

enter image description here

Kliknięcie otwiera pełne wyniki w przeglądarce XML. Przewijanie w prawo pokazuje, że ostatni znak B jest zachowany,

Jednak ma to pewne poważne problemy. Dodanie dodatkowych kolumn do zapytania powoduje zerwanie efektu, a dodatkowe wiersze zostają połączone z pierwszym. Na koniec, jeśli ciąg zawiera znaki takie jak <, otwarcie przeglądarki XML kończy się niepowodzeniem z błędem parsowania.

Bardziej niezawodny sposób, aby uniknąć problemów z SQL Server konwertowaniem < na &lt; itp. Lub z powodu tych znaków nie dział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

Dodawanie CDATA do instrukcji Convert zadziałało! Wielkie dzięki. :) – adamjford

+0

Dodanie 'CDATA' może działać, ale jeśli twoje dane zawierają znaki kontrolne, musisz wykonać operację zamiany. W moim przypadku użyłem Separator jednostek, kod 31 ASCII, w moich danych. Ponieważ używałem tylko tej jednej litery w wielu miejscach, wystarczył prosty "REPLACE (details, char (31)," &x1f; '). Gdybym miał nieznane postacie lub wiele różnych postaci do zastąpienia, być może musiałbym znaleźć inne rozwiązanie. – Zarepheth

+0

@Zarepheth - Pomysł "CDATA" był moją pierwszą propozycją. Późniejsza z 'AS [processing-instruction (x)] unika tego. –

2

Wygląda na to, że Xml może nie być dobrze uformowany. W takim przypadku nie będziesz mógł przesyłać go jako Xml i biorąc pod uwagę to, ile słów możesz zwrócić w Management Studio. Można jednak podzielić tekst na mniejsze części:

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 

Następnie trzeba ręcznie połączyć je ponownie.

EDIT

Brzmi jak istnieją pewne znaki w danych text że parser nie lubi. Możesz spróbować przekonwertować te wartości na podmioty, a następnie wypróbować sztuczkę Convert(xml, data). Więc coś takiego:

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

(Musiałem oddać do varchar (max), ponieważ zastąpienie funkcja nie będzie działać na text kolumn Nie powinno być żadnego powodu, nie można konwertować te kolumny do varchar(max)text.).

+0

Och, przypuszczam, że powinienem wspomnieć, że kolumna nie jest wcale XML. Konwersja kolumny do XML to tylko obejście, które znalazłem w Googlingu, że ktoś inny użył do obejścia limitu SSMS ma pobieranie danych z kolumny 'text' lub' varchar (MAX) '. – adamjford

+1

EDIT o kodzie powyżej; Z -c ( Wybierz ROW_NUMBER() OVER (ORDER BY s1.id) - 1, jak Num Od sys.sysobjects S1 Krzyż Dołącz sys.sysobjects As s2 ) Select (podciąg T1.YourTextCol, T2.Num * 8000 + 1, 8000) Od YourTable Jako T1 Krzyż Dołącz Tally Jak T2 Gdzie T2.Num <= sufitowa (datalength (T1.YourTextCol)/8000) Zamówienie Przez T2.Num –

+0

Korzystanie z 'TSQL' @IanQuigley na podstawie tej odpowiedzi działa dobrze dla mnie. Zasadniczo podjąłem wyniki (skończyło się 11 rekordów) i wkleiłem je razem w Notatniku. Działa doskonale. Musisz zapisać ten skrypt. Miałem trochę zwariowanego XML, który zawierał nieprawidłowe znaki. – atconway

2

Typ danych TEKST jest stary i nie należy go już używać, wybór danych z kolumny TEKST jest trudny.

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.

trzeba użyć TEXTPTR (Transact-SQL) do pobierania danych tekstowych.

Zobacz także artykuł na temat Handling The Text Data Type.

+0

Czy konwersja kolumny na 'varchar (MAX) 'uniemożliwi SSMSowi obcięcie z niej danych? – adamjford

+0

Najpierw użyłbym SSMS do wygenerowania skryptu do konwersji twojej kolumny TEXT na varchar (max). Stamtąd możesz ocenić, czy chcesz dalej przekonwertować go do kolumny XML. Jeśli chodzi o limity wyświetlania SSMS, wyniki w siatce można ustawić tak, aby wyświetlały do ​​65 535 znaków danych innych niż xml na kolumnę i do nieograniczonej ilości danych xml (fyi, kolumny tabeli typu XML mogą przechowywać tylko 2 GB). Podczas gdy wyniki dla tekstu są ograniczone do 8192 znaków na kolumnę. Aby ustawić te domyślne maksymalne limity, przejdź do menu NARZĘDZIA (w SSMS), następnie OPTIONS ... następnie QUERY RESULTS, następnie SQL SERVER, następnie WYNIKI DO GRIDOWANIA lub REZULTATY DO TEKSTU. –

0

Masz szczęście, tak myślę.Problem nie jest problemem na poziomie SQL, ponieważ wszystkie inne odpowiedzi wydają się skupiać na, ale po prostu jednym z interfejsu użytkownika. Management Studio nie jest uniwersalnym interfejsem dostępu do danych. To nie jest interfejs użytkownika, ale obszar administracyjny, który ma poważne ograniczenia w przetwarzaniu danych binarnych i dużych danych testowych - ponieważ osoby używające go w określonym profilu użytkowania nie napotkają na ten problem.

Prezentowanie dużych danych tekstowych nie jest po prostu planowanym użyciem.

Jedynym wyborem jest funkcja wyceniana w tabeli, która pobiera dane wejściowe i wycina wiersze dla każdej linii, tak aby program Management Studio uzyskał listę wierszy, a nie pojedynczy wiersz.

+0

Czuję, że ta odpowiedź jest w najlepszym razie zgadywaniem, czy też masz jakieś źródła "planowanego użycia"? Jeśli jest to "studio zarządzania" SQL, powinno przynajmniej być w stanie pokazać mi zawartość moich baz danych. Absolutnie okropny interfejs. – damd

4

Najprostszym rozwiązaniem, jakie znalazłem, jest utworzenie kopii zapasowej tabeli i wyświetlenie skryptu. Aby to zrobić

  1. Kliknij prawym przyciskiem myszy bazę danych i wybrać Tasks>Generate Scripts...
  2. strona
  3. "Wprowadzenie" click Next
  4. "Wybierz obiektów" strona
    1. Wybierz Select specific database objects i wybierz tabelę.
    2. Kliknij Next
  5. "Ustawianie opcji skryptów" strona
    1. Ustawić typ wyjścia do Save scripts to a specific location
    2. Select Save to file i wypełnić związane z opcjami
    3. Kliknij przycisk Advanced
    4. Ustaw General >Types of data to script do Data only lub Schema and Data i kliknij przycisk OK
    5. Kliknij Next
  6. "Podsumowanie Page" kliknij obok
  7. Twój skrypt SQL powinny być generowane na podstawie wybranych opcji w 4.2. Otwórz ten plik i wyświetl swoje dane.
+0

Dziękuję - to działało dobrze! – skiphoppy

28

udało mi się uzyskać to do pracy ...

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

wolę tę prostą XML siekać co sprawia, że ​​kolumny klikalne w SSMS na bazie komórek przez komórkę. Za pomocą tej metody można szybko wyświetlić dane w widoku tabelarycznym SSMS i kliknąć konkretne komórki, aby zobaczyć pełną wartość, gdy są interesujące. Jest to identyczne z techniką OP, z tym że unika błędów 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

Jeden obejście jest kliknięcie prawym przyciskiem myszy na zbiorze wynikowym i wybierz „Zapisz wyniki jako ...”. Wyeksportuje go do pliku CSV z całą zawartością kolumny. Nie idealne, ale działało na mnie wystarczająco dobrze.

Workaround

0

Próbowałeś to proste rozwiązanie? Tylko 2 kliknięcia dalej!

W oknie zapytań

  1. opcje zestaw zapytań do „wyników do siatki”, należy uruchomić zapytanie
  2. Kliknij prawym przyciskiem myszy na karcie wyników na rogu siatki, zapisać wyniki wszystkich plików

Otrzymasz cały tekst, który chcesz zobaczyć w pliku !!! Widzę 130,556 znaków dla mojego wyniku pola varchar (max)

Results in a file

Powiązane problemy