W tej działającej bazie danych SQL Server 2008 (kompilacja 10.0.1600) znajduje się Events
tabela, która zawiera text
kolumnę o nazwie Details
. (Tak, zdaję sobie sprawę, że to właściwie powinna być varchar(MAX)
kolumna, ale ktokolwiek ustawił tę bazę danych, nie zrobił tego w ten sposób).
Ta kolumna zawiera bardzo duże dzienniki wyjątków i powiązanych danych JSON, do których próbuję uzyskać dostęp za pośrednictwem programu SQL Server Management Studio, ale za każdym razem, gdy kopiuję wyniki z siatki do edytora tekstu, obcina je do 43679 znaków.
Czytałem w różnych miejscach w Internecie, że możesz ustawić maksymalną liczbę znaków pobieranych dla danych XML Tools > Options > Query Results > SQL Server > Results To Grid
na nieograniczoną, a następnie wykonać zapytanie takie jak to:
select Convert(xml, Details) from Events
where EventID = 13920
(Zwróć uwagę, że kolumna danych nie jest w ogóle XML. CONVERT
Przekazywanie kolumny do formatu XML to tylko obejście, które znalazłem w Google, a ktoś inny użył go do obejścia limitu, jaki SSMS ma przy pobieraniu danych z kolumny text
lub varchar(MAX)
).
Jednak po ustawieniu powyższej opcji, uruchomieniu zapytania i kliknięciu w link w wyniku nadal otrzymuję następujący błąd:
Nie można wyświetlić XML. Wystąpił następujący błąd: Wystąpił nieoczekiwany koniec pliku. Wiersz 5, pozycja 220160.
Jednym z rozwiązań jest zwiększenie liczby znaków pobieranych z serwera dla danych XML. Aby zmienić to ustawienie, w menu Narzędzia kliknij polecenie Opcje.
Więc masz jakiś pomysł, jak uzyskać dostęp do tych danych? Czy konwersja kolumny, aby varchar(MAX)
naprawić moje nieszczęścia?
źródło
CDATA
może działać, ale jeśli dane zawierają znaki sterujące, musisz wykonać operację zamiany. W moim przypadku używałem separatora jednostek, kodu ASCII 31, w moich danych. Ponieważ używałem tylko tej jednej postaci w wielu miejscach,REPLACE(details, char(31), '&x1f;')
wystarczył prosty . Gdybym miał nieznane znaki lub dużą liczbę różnych znaków do zastąpienia, być może musiałbym znaleźć inne rozwiązanie.CDATA
była moja pierwsza sugestia. Późniejsza z nichAS [processing-instruction(x)]
unika tego.Udało mi się to uruchomić ...
SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;
źródło
Jedynym sposobem obejścia problemu jest kliknięcie prawym przyciskiem myszy zestawu wyników i wybranie opcji „Zapisz wyniki jako ...”. Spowoduje to wyeksportowanie go do pliku CSV z całą zawartością kolumny. Nie idealne, ale dla mnie działało wystarczająco dobrze.
źródło
Czy wypróbowałeś to proste rozwiązanie? Tylko 2 kliknięcia!
W oknie zapytania
Otrzymasz cały tekst, który chcesz zobaczyć w pliku !!! Widzę 130 556 znaków dla mojego wyniku pola varchar (MAX)
źródło
Najprostszym rozwiązaniem, jakie znalazłem, jest utworzenie kopii zapasowej tabeli i wyświetlenie skryptu. Aby to zrobić
Tasks
>Generate Scripts...
Next
Select specific database objects
i wybierz swój stół.Next
Save scripts to a specific location
Save to file
i wypełnij powiązane opcjeAdvanced
przyciskGeneral
>Types of data to script
naData only
lubSchema and Data
i kliknij OKNext
źródło
Typ danych TEKST jest stary i nie powinien być już używany, uciążliwe jest wybieranie danych z kolumny TEKST.
ntext, tekst i obraz (Transact-SQL)
musisz użyć TEXTPTR (Transact-SQL), aby pobrać dane tekstowe.
Zobacz także ten artykuł dotyczący obsługi typu danych tekstowych .
źródło
varchar(MAX)
uniemożliwić SSMS obcięcie danych z niej?Wygląda na to, że Xml może nie być dobrze uformowany. W takim przypadku nie będziesz w stanie przesłać go jako Xml, a biorąc pod uwagę to, jesteś ograniczony co do tego, ile tekstu możesz zwrócić w Management Studio. Możesz jednak podzielić tekst na mniejsze fragmenty, na przykład:
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 by je ponownie połączyć ręcznie.
EDYTOWAĆ
Wygląda na to, że w
text
danych są znaki , których parser Xml nie lubi. Możesz spróbować przekonwertować te wartości na encje, a następnie spróbowaćConvert(xml, data)
sztuczki. Więc coś takiego:Update Table Set Data = Replace(Cast(Data As varchar(max)),'<','<')
(Musiałem rzutować na varchar (max), ponieważ funkcja zamiany nie będzie działać na
text
kolumnach. Nie powinno być żadnego powodu, dla którego nie można by przekonwertować tychtext
kolumn navarchar(max)
.)źródło
text
lubvarchar(MAX)
.TSQL
z @IanQuigley na podstawie tej odpowiedzi działało dobrze dla mnie. Zasadniczo wziąłem wyniki (skończyło się na 11 rekordach) i po prostu wkleiłem je razem w Notatniku. Działał doskonale. Musisz zapisać ten skrypt. Miałem szalenie długi plik XML zawierający nieprawidłowe znaki.Wolę ten prosty hack XML, który sprawia, że kolumny w SSMS są klikalne na podstawie komórki po komórce. Dzięki tej metodzie możesz szybko przeglądać dane w widoku tabelarycznym SSMS i klikać poszczególne komórki, aby zobaczyć pełną wartość, gdy są interesujące. Jest to identyczne z techniką OP, z wyjątkiem tego, że pozwala uniknąć błędów XML.
SELECT e.EventID ,CAST(REPLACE(REPLACE(e.Details, '&', '&'), '<', '<') AS XML) Details FROM Events e WHERE 1=1 AND e.EventID BETWEEN 13920 AND 13930 ;
źródło
NVARCHAR
/VARCHAR
. Na przykład znak NUL (inny niżNULL
jako wartość pola). Rzutowanie zakończy się niepowodzeniem dla ciągów z takimi osadzonymi wartościami.Począwszy od SSMS 18.2, możesz teraz wyświetlać do 2 milionów znaków w wynikach siatki. Źródło
Sprawdziłem to za pomocą poniższego kodu.
DECLARE @S varchar(max) = 'A' SET @S = REPLICATE(@S,2000000) + 'B' SELECT @S as a
źródło
Myślę, że nie masz szczęścia. Problem nie jest problemem na poziomie SQL, na którym zdają się koncentrować wszystkie inne odpowiedzi, ale po prostu jednym z interfejsów użytkownika. Management Studio nie jest przeznaczony do ogólnego przeznaczenia / ogólnego interfejsu dostępu do danych. To nie jest twój interfejs, ale twój obszar administracyjny i ma poważne ograniczenia w obsłudze danych binarnych i dużych danych testowych - ponieważ osoby używające go w określonym profilu użytkowania nie napotkają tego problemu.
Przedstawianie dużych danych tekstowych po prostu nie jest planowanym użyciem.
Jedynym wyborem byłaby funkcja wartościowana w tabeli, która pobiera dane wejściowe i wycina je w wierszach dla każdego wiersza, tak aby Management Studio otrzymało listę wierszy, a nie jeden wiersz.
źródło