SQL Server 2008 Management Studio'da bir metin veya varchar (MAX) sütununun tüm içeriğini nasıl görüntüleyebilirim?


98

Bu canlı SQL Server 2008 (derleme 10.0.1600) veritabanında, adlı Eventsbir textsütun içeren bir tablo var Details. (Evet, bunun bir varchar(MAX)sütun olması gerektiğini biliyorum , ancak bu veritabanını her kim kurduysa bu şekilde yapmadı.)

Bu sütun, çok büyük istisna günlükleri ve SQL Server Management Studio aracılığıyla erişmeye çalıştığım ilişkili JSON verilerini içeriyor, ancak sonuçları ızgaradan bir metin düzenleyiciye kopyaladığımda 43679 karakterde kesiyor.

İnternetteki çeşitli yerlerde, XML Verileri için Alınan Maksimum Karakter sayınızı Tools > Options > Query Results > SQL Server > Results To GridSınırsız olarak ayarlayabileceğinizi ve ardından aşağıdaki gibi bir sorgu gerçekleştirebileceğinizi okudum :

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

(Verinin sütunun hiç XML olmadığını unutmayın. CONVERTSütunu XML'e dönüştürmek, yalnızca Google'da bulduğum, SSMS'nin bir textveya varchar(MAX)sütundan veri almaktan kaynaklanan sınırı aşmak için başka birinin kullandığı bir geçici çözümdür .)

Ancak yukarıdaki seçeneği ayarladıktan, sorguyu çalıştırdıktan ve sonuçtaki bağlantıya tıkladıktan sonra hala aşağıdaki hatayı alıyorum:

XML gösterilemiyor. Aşağıdaki hata oluştu: Beklenmeyen dosya sonu oluştu. Satır 5, pozisyon 220160.

Çözümlerden biri, XML verileri için sunucudan alınan karakter sayısını artırmaktır. Bu ayarı değiştirmek için Araçlar menüsünde Seçenekler'i tıklayın.

Peki, bu verilere nasıl erişileceğine dair bir fikriniz var mı? Sütunu dönüştürmek varchar(MAX)dertlerimi giderir mi?

Yanıtlar:


99

SSMS yalnızca XML verileri için sınırsız veriye izin verir. Bu varsayılan değildir ve seçeneklerde ayarlanması gerekir.

görüntü açıklamasını buraya girin

Oldukça sınırlı koşullarda işe yarayabilecek bir püf noktası, sütunu aşağıdaki gibi özel bir şekilde adlandırmaktır, böylece XML verileri olarak ele alınır.

DECLARE @S varchar(max) = 'A'

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

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

SSMS'de (en azından 2012'den 18.3'e kadar olan sürümler) bu, sonuçları aşağıdaki gibi görüntüler

görüntü açıklamasını buraya girin

Üzerine tıklamak, tüm sonuçları XML görüntüleyicide açar. Sağa kaydırma, B'nin son karakterinin korunduğunu gösterir,

Ancak bunun bazı önemli sorunları var. Sorguya fazladan sütunlar eklemek etkiyi keser ve fazladan satırların tümü ilkiyle birleştirilir. Son olarak, dize <, XML görüntüleyiciyi açmak gibi karakterler içeriyorsa , bir ayrıştırma hatasıyla başarısız olur.

Bunu yapmanın SQL Server'ın vb <. &lt;Gibi sorunlardan kaçınan veya bu karakterlerden dolayı başarısız olmasını engelleyen daha sağlam bir yolu aşağıdadır ( burada Adam Machanic'e bakın ).

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
Convert deyimine CDATA eklemek işe yaradı! Çok teşekkürler. :)
adamjford

Ekleme CDATAişe yarayabilir, ancak verileriniz kontrol karakterleri içeriyorsa, bir değiştirme işlemi gerçekleştirmeniz gerekir. Benim durumumda, verilerim içinde Birim Ayırıcı, ASCII Kod 31 kullanıyordum. Birçok yerde sadece o karakteri kullandığım için, basit bir şey REPLACE(details, char(31), '&x1f;')yeterli. Bilinmeyen karakterlerim olsaydı veya değiştirilecek çok sayıda farklı karakterim varsa, başka bir çözüm bulmam gerekebilirdi.
Zarepheth

@Zarepheth - Bu CDATAbenim ilk önerimdi. Sonraki biri AS [processing-instruction(x)]olduğunu kaçınır.
Martin Smith

2
@MartinSmith mükemmel cevap! Cevaplarınızdan ne kadar öğrendiğimi merak ediyorum! +1
Kin Shah

54

Bunu çalıştırmayı başardım ...

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

28

Çözümlerden biri, sonuç kümesine sağ tıklamak ve "Sonuçları Farklı Kaydet ..." seçeneğini seçmektir. Bu, sütunun tüm içeriğiyle birlikte bir CSV dosyasına aktarır. Mükemmel değil ama benim için yeterince iyi çalıştı.

Geçici çözüm


11

Bu basit çözümü denediniz mi? Sadece 2 tık uzakta!

Sorgu penceresinde,

  1. sorgu seçeneklerini "Sonuçlar Kılavuza" ayarlayın, sorgunuzu çalıştırın
  2. Izgara köşesindeki sonuçlar sekmesine sağ tıklayın, sonuçları herhangi bir dosya olarak kaydedin

Dosyada görmek istediğiniz tüm metni alacaksınız !!! Varchar (MAX) alanı sonucum için 130.556 karakter görebiliyorum

Bir dosyada sonuçlar


1
Düz - kolay - ve tekrar ihtiyacın olana kadar her zaman unutulur :)
Dimi Takis

5

Bulduğum en basit çözüm, tabloyu yedeklemek ve komut dosyasını görüntülemek. Bunu yapmak için

  1. Veritabanınıza sağ tıklayın ve Tasks>Generate Scripts...
  2. "Giriş" sayfası tıklaması Next
  3. "Nesneleri Seçin" sayfası
    1. Select specific database objectsTablonuzu seçin ve seçin.
    2. Tıklayın Next
  4. "Komut Dosyası Seçeneklerini Ayarla" sayfası
    1. Çıktı türünü şu şekilde ayarlayın: Save scripts to a specific location
    2. Save to fileİlgili seçenekleri seçin ve doldurun
    3. Düğmesini Advancedtıklayın
    4. Set General> Types of data to scriptiçin Data onlyya Schema and Datave tıklama tamam
    5. Tıklayın Next
  5. "Özet Sayfası" ileri tıklayın
  6. Sql betiğiniz 4.2'de belirlediğiniz seçeneklere göre oluşturulmalıdır. Bu dosyayı açın ve verilerinizi görüntüleyin.

3

TEXT veri türü eskidir ve artık kullanılmamalıdır, bir TEXT sütunundan veri seçmek zahmetlidir.

ntext, text ve image (Transact-SQL)

ntext, text ve image veri türleri, Microsoft SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Bu veri türlerini yeni geliştirme çalışmasında kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine nvarchar (max), varchar (max) ve varbinary (max) kullanın.

metin verilerini almak için TEXTPTR (Transact-SQL) kullanmanız gerekir .

Ayrıca Metin Veri Türünü Kullanma hakkındaki bu makaleye bakın .


Sütunu dönüştürmek, varchar(MAX)SSMS'nin veriyi kesmesini engelleyecek mi?
adamjford

TEXT sütununuzu varchar (max) 'a dönüştürmek için komut dosyasını oluşturmak için ilk olarak SSMS'yi kullanırdım. Oradan, onu bir XML sütununa dönüştürmek isteyip istemediğinizi değerlendirebilirsiniz. SSMS görüntüleme sınırlarına gelince, kılavuz sonuçları sütun başına 65.535 karaktere kadar xml dışı veriyi ve sınırsız miktarda xml verisini gösterecek şekilde ayarlanabilir (fyi, XML türündeki tablo sütunları yalnızca 2 GB depolayabilir). Metne ilişkin sonuçlar sütun başına 8192 karakterle sınırlıdır. Bu varsayılan maksimum sınırları ayarlamak için, (SSMS'de) ARAÇLAR menüsüne, ardından SEÇENEKLER… ardından SORGU SONUÇLARI, ardından SQL SUNUCUSU, ardından GRID İÇİN SONUÇLAR veya METİN İÇİN SONUÇLAR'a gidin.
KM.

3

Görünüşe göre Xml iyi biçimlendirilmemiş olabilir. Bu durumda, onu Xml olarak çeviremezsiniz ve buna göre, Management Studio'da ne kadar metin döndürebileceğiniz konusunda sınırlısınızdır. Ancak, metni aşağıdaki gibi daha küçük parçalara bölebilirsiniz:

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

Daha sonra bunları manuel olarak yeniden birleştirmeniz gerekir.

DÜZENLE

textVeride Xml ayrıştırıcısının sevmediği bazı karakterler var gibi görünüyor. Bu değerleri varlıklara dönüştürmeyi deneyebilir ve sonra Convert(xml, data)hileyi deneyebilirsiniz . Yani şöyle bir şey:

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

(Varchar (max) 'a çevirmem gerekiyordu çünkü değiştirme işlevi textsütunlarda çalışmayacak . Bu textsütunları dönüştürmemeniz için herhangi bir sebep olmamalı varchar(max).)


Oh, sanırım sütunun hiç XML olmadığını belirtmeliyim. Sütunu XML'e DÖNÜŞTÜRMEK, yalnızca Google'da bulduğum ve SSMS'nin bir textveya varchar(MAX)sütundan veri alma sınırını aşmak için başka birinin kullandığını bulduğum bir geçici çözüm .
adamjford

1
Yukarıdaki kodunuzun DÜZENLENMESİ; Tally As ile (SEÇ_NUMBER () ÜSTÜNDE (s1.id ile SİPARİŞ EDİN) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Substring (T1.YourTextCol, T2.Num) seçin * 8000 + 1, 8000) YourTable As T1 Cross'tan Üyelik Tally olarak T2 nerede T2.Num <= Tavan (veri boyu (T1.YourTextCol) / 8000) Sıralama T2.Num
Ian Quigley

TSQLBu cevaba göre from @IanQuigley'i kullanmak benim için iyi çalıştı. Temelde sonuçları aldım (sonunda 11 kayıt oldu) ve bunları Not Defteri'nde birbirine yapıştırdım. Mükemmel çalıştı. Bu komut dosyasını kaydetmeniz gerekiyor. Geçersiz karakterler içeren çılgınca uzun bir XML'im vardı.
atconway

1

Şansın yok sanırım. Sorun, diğer tüm yanıtların odaklandığı gibi, SQL düzeyinde bir sorun değil, yalnızca kullanıcı arayüzünden biridir. Management Studio genel amaçlı / genel bir veri erişim arayüzü değildir. Arayüzünüz değil, yönetim alanınız olacaktır ve ikili verileri ve büyük test verilerini işlemede ciddi sınırlamalara sahiptir - çünkü onu belirtilen kullanım profili dahilinde kullanan kişiler bu problemle karşılaşmayacaktır.

Büyük metin verilerinin sunulması, planlanan kullanım değildir.

Tek seçeneğiniz, metin girişini alan ve her satır için satırları kesen tablo değerli bir işlev olacaktır, böylece Management Studio tek bir satır değil, satır listesi alır.


Bu cevabın en iyi ihtimalle tahmin yürütmek olduğunu düşünüyorum veya "planlı kullanım" için herhangi bir kaynağınız var mı? Bir SQL "yönetim stüdyosu" ise, en azından veritabanlarımın içeriğini bana gösterebilmelidir. Kesinlikle korkunç kullanıcı arayüzü.
2017

Bu cevap artık geçerli olmadığından silinmelidir
Caius Jard

1

SSMS'de sütunları hücre bazında tıklanabilir hale getiren bu basit XML hack'ini tercih ediyorum. Bu yöntemle, verilerinizi SSMS'nin tablo görünümünde hızlı bir şekilde görüntüleyebilir ve ilginç olduklarında tam değeri görmek için belirli hücrelere tıklayabilirsiniz. Bu, XML hatalarını önlemesi dışında OP'nin tekniğiyle aynıdır.

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
;

XML 1.0'da bazı karakterlerin geçersiz ancak NVARCHAR/ içinde geçerli olduğuna dikkat edin VARCHAR. Örneğin, NUL karakteri ( NULLalan için bir değerden farklı ). Bu tür gömülü değerlere sahip dizeler için çevrim başarısız olacaktır.
binki

1

SSMS 18.2'den başlayarak, artık ızgara sonuçlarında 2 milyona kadar karakteri görüntüleyebilirsiniz. Kaynak

Daha fazla verinin görüntülenmesine (Sonuçtan Metne) ve hücrelerde saklanmasına (Sonuçtan Kılavuza) izin verin. SSMS artık her ikisi için 2 milyon karaktere kadar izin veriyor.

Bunu aşağıdaki kodla doğruladım.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a

1
Maksimum Karakter aslında 2097152 ( SSMS sürüm 15.0.18333.0 ).
stomy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.