Bagaimana cara melihat konten lengkap kolom teks atau varchar (MAX) di SQL Server 2008 Management Studio?

98

Dalam database SQL Server 2008 (build 10.0.1600) langsung ini, ada Eventstabel, yang berisi textkolom bernama Details. (Ya, saya menyadari ini seharusnya menjadi varchar(MAX)kolom, tetapi siapa pun yang mengatur database ini tidak melakukannya dengan cara itu.)

Kolom ini berisi log pengecualian yang sangat besar dan data JSON terkait yang saya coba akses melalui SQL Server Management Studio, tetapi setiap kali saya menyalin hasil dari grid ke editor teks, ia memotongnya menjadi 43679 karakter.

Saya telah membaca di berbagai lokasi di Internet bahwa Anda dapat mengatur Karakter Maksimum yang Diperoleh untuk Data XML Tools > Options > Query Results > SQL Server > Results To Gridke Tidak Terbatas, lalu melakukan kueri seperti ini:

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

(Perhatikan bahwa data dalam kolom sama sekali bukan XML. CONVERTMembuat kolom ke XML hanyalah solusi yang saya temukan dari Googling bahwa orang lain telah digunakan untuk mengatasi batas yang dimiliki SSMS dari mengambil data dari kolom textatau varchar(MAX).)

Namun, setelah mengatur opsi di atas, menjalankan kueri, dan mengklik tautan di hasilnya, saya masih mendapatkan kesalahan berikut:

Tidak dapat menampilkan XML. Galat berikut terjadi: Akhir berkas tak terduga telah terjadi. Baris 5, posisi 220160.

Salah satu solusinya adalah dengan meningkatkan jumlah karakter yang diambil dari server untuk data XML. Untuk mengubah pengaturan ini, pada menu Alat, klik Opsi.

Jadi, ada ide tentang cara mengakses data ini? Akankah mengubah kolom untuk varchar(MAX)memperbaiki kesengsaraan saya?

adamjford
sumber

Jawaban:

98

SSMS hanya mengizinkan data tak terbatas untuk data XML. Ini bukan default dan perlu diatur dalam opsi.

masukkan deskripsi gambar di sini

Salah satu trik yang mungkin berhasil dalam keadaan yang sangat terbatas adalah dengan memberi nama kolom dengan cara khusus seperti di bawah ini sehingga akan diperlakukan sebagai data XML.

DECLARE @S varchar(max) = 'A'

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

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

Dalam SSMS (setidaknya versi 2012 hingga saat ini dari 18.3) ini menampilkan hasil seperti di bawah ini

masukkan deskripsi gambar di sini

Mengkliknya membuka hasil lengkap di XML viewer. Menggulir ke kanan menunjukkan karakter terakhir B yang dipertahankan,

Namun hal ini memiliki beberapa masalah yang signifikan. Menambahkan kolom ekstra ke kueri akan memecah efek dan baris tambahan semuanya menjadi digabungkan dengan yang pertama. Akhirnya jika string berisi karakter seperti <membuka XML viewer gagal dengan kesalahan parsing.

Cara yang lebih kuat untuk melakukan ini yang menghindari masalah konversi SQL Server <ke &lt;dll atau gagal karena karakter ini ada di bawah ( kredit Adam Machanic di sini ).

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
sumber
2
Menambahkan CDATA ke pernyataan Convert berhasil! Terima kasih banyak. :)
adamjford
Menambahkan CDATAmungkin berhasil, tetapi jika data Anda menyertakan karakter kontrol, Anda harus melakukan operasi penggantian. Dalam kasus saya, saya menggunakan Pemisah Unit, ASCII Code 31, dalam data saya. Karena saya hanya menggunakan satu karakter itu di banyak tempat, yang sederhana sudah REPLACE(details, char(31), '&x1f;')cukup. Jika saya memiliki karakter yang tidak diketahui atau sejumlah besar karakter berbeda untuk diganti, saya mungkin harus mencari solusi lain.
Zarepheth
@Zarepheth - Hal CDATAitu adalah saran pertama saya. Yang terakhir AS [processing-instruction(x)]menghindari itu.
Martin Smith
2
@MartinSmith jawaban yang sangat bagus! Bertanya-tanya seberapa banyak saya belajar dari jawaban Anda! +1
Kin Shah
54

Saya bisa membuat ini bekerja ...

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

Salah satu solusinya adalah dengan mengklik kanan pada kumpulan hasil dan pilih "Simpan Hasil Sebagai ...". Ini mengekspornya ke file CSV dengan seluruh konten kolom. Tidak sempurna tetapi bekerja cukup baik untuk saya.

Solusi

Darky711
sumber
11

Apakah Anda mencoba solusi sederhana ini? Hanya 2 klik saja!

Di jendela kueri,

  1. setel opsi kueri ke "Hasil ke Kisi", jalankan kueri Anda
  2. Klik kanan pada tab hasil di sudut kisi, simpan hasil sebagai file apa pun

Anda akan mendapatkan semua teks yang ingin Anda lihat di file !!! Saya dapat melihat 130.556 karakter untuk hasil saya dari bidang varchar (MAX)

Menghasilkan sebuah file

Daun Jenna
sumber
1
Lurus - mudah - dan selalu dilupakan sampai Anda membutuhkannya lagi :)
Dimi Takis
5

Solusi paling sederhana yang saya temukan adalah mencadangkan tabel dan melihat skrip. Untuk melakukan ini

  1. Klik kanan database Anda dan pilih Tasks>Generate Scripts...
  2. Klik halaman "Pendahuluan" Next
  3. Halaman "Pilih Objek"
    1. Pilih Select specific database objectsdan pilih tabel Anda.
    2. Klik Next
  4. Halaman "Set Scripting Options"
    1. Setel jenis keluaran ke Save scripts to a specific location
    2. Pilih Save to file dan isi opsi terkait
    3. Klik Advanced tombol tersebut
    4. Setel General> Types of data to scriptke Data onlyatau Schema and Datadan klik ok
    5. Klik Next
  5. "Halaman Ringkasan" klik berikutnya
  6. Skrip sql Anda harus dibuat berdasarkan opsi yang Anda setel di 4.2. Buka file ini dan lihat data Anda.
Kevin Brydon
sumber
3

Tipe data TEXT sudah tua dan tidak boleh digunakan lagi, sangat merepotkan untuk memilih data dari kolom TEXT.

ntext, teks, dan gambar (Transact-SQL)

Tipe data nteks, teks, dan gambar akan dihapus di versi Microsoft SQL Server mendatang. Hindari menggunakan tipe data ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakannya. Gunakan nvarchar (max), varchar (max), dan varbinary (max) sebagai gantinya.

Anda perlu menggunakan TEXTPTR (Transact-SQL) untuk mengambil data teks.

Juga lihat artikel ini tentang Menangani Tipe Data Teks .

KM.
sumber
Akankah mengubah kolom untuk varchar(MAX)mencegah SSMS memotong data darinya?
adamjford
Saya pertama-tama akan menggunakan SSMS untuk menghasilkan skrip untuk mengubah kolom TEXT Anda menjadi varchar (maks). Dari sana Anda dapat mengevaluasi jika Anda ingin mengubahnya lebih lanjut menjadi kolom XML. Sedangkan untuk batas tampilan SSMS, hasil ke kisi dapat disetel untuk menampilkan hingga 65.535 karakter data non xml per kolom, dan hingga jumlah data xml yang tidak terbatas (fyi, kolom tabel jenis XML hanya dapat menyimpan 2 GB). Sedangkan hasil untuk teks dibatasi 8192 karakter per kolom. Untuk menyetel batas maks default ini, cukup masuk ke menu (dalam SSMS) TOOLS, lalu OPTIONS ... lalu QUERY RESULTS, lalu SQL SERVER, lalu RESULTS TO GRID atau RESULTS TO TEXT.
KM.
3

Sepertinya Xml tidak terbentuk dengan baik. Jika demikian, Anda tidak akan dapat mentransmisikannya sebagai Xml dan karena itu, Anda dibatasi dalam jumlah teks yang dapat dikembalikan di Management Studio. Namun, Anda dapat memecah teks menjadi bagian yang lebih kecil seperti:

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

Anda kemudian perlu menggabungkannya lagi secara manual.

EDIT

Sepertinya ada beberapa karakter dalam textdata yang tidak disukai parser Xml. Anda dapat mencoba mengubah nilai-nilai tersebut menjadi entitas dan kemudian mencoba Convert(xml, data)triknya. Jadi sesuatu seperti:

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

(Saya perlu melakukan cast ke varchar (max) karena fungsi replace tidak akan berfungsi pada textkolom. Seharusnya tidak ada alasan Anda tidak dapat mengubah textkolom tersebut menjadi varchar(max).)

Thomas
sumber
Oh, saya kira saya harus menyebutkan bahwa kolom tersebut sama sekali bukan XML. MENGUBAH kolom ke XML hanyalah solusi yang saya temukan dari Googling bahwa orang lain telah digunakan untuk mengatasi batas yang dimiliki SSMS dari mengambil data dari kolom textatau varchar(MAX).
adamjford
1
EDIT kode Anda di atas; Dengan Tally As (Pilih ROW_NUMBER () OVER (ORDER BY s1.id) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2) Pilih Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) Dari Tabel Anda Sebagai T1 Cross Bergabung dengan Penghitungan Sebagai T2 Dimana T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Pesan Berdasarkan T2.Num
Ian Quigley
Menggunakan TSQLdari @IanQuigley berdasarkan jawaban ini bekerja dengan baik untuk saya. Saya pada dasarnya mengambil hasilnya (akhirnya menjadi 11 catatan) dan hanya menempelkannya bersama di Notepad. Bekerja dengan sempurna. Perlu menyimpan skrip ini. Saya memiliki beberapa XML sangat panjang yang menyertakan karakter tidak valid.
atconway
1

Saya lebih suka peretasan XML sederhana ini yang membuat kolom dapat diklik di SSMS pada basis sel demi sel. Dengan metode ini, Anda dapat melihat data Anda dengan cepat di tampilan tabular SSMS dan mengklik sel tertentu untuk melihat nilai penuhnya jika menarik. Ini identik dengan teknik OP kecuali untuk menghindari kesalahan 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
;
binki
sumber
Perhatikan bahwa beberapa karakter tidak valid di XML 1.0 tetapi valid di NVARCHAR/ VARCHAR. Misalnya, karakter NUL (berbeda dari NULLsebagai nilai untuk bidang). Pemeran akan gagal untuk string dengan nilai yang disematkan seperti itu.
binki
1

Mulai dari SSMS 18.2, Anda sekarang dapat melihat hingga 2 juta karakter dalam hasil kisi. Sumber

Izinkan lebih banyak data untuk ditampilkan (Hasil ke Teks) dan disimpan dalam sel (Hasil ke Kisi). SSMS sekarang mengizinkan hingga 2 juta karakter untuk keduanya.

Saya memverifikasi ini dengan kode di bawah ini.

DECLARE @S varchar(max) = 'A'

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

SELECT @S as a
Gabe
sumber
1
Karakter Maksimum sebenarnya adalah 2097152 ( dalam SSMS versi 15.0.18333.0 ).
Stomy
0

Anda kurang beruntung, saya pikir. Masalahnya bukanlah masalah level SQL karena semua jawaban lain tampaknya fokus, tetapi hanya salah satu antarmuka pengguna. Studio Manajemen tidak dimaksudkan sebagai antarmuka akses data untuk tujuan umum / umum. Tidak ada antarmuka Anda, tetapi area administratif Anda, dan memiliki batasan serius dalam menangani data biner dan data uji yang besar - karena orang yang menggunakannya dalam profil penggunaan yang ditentukan tidak akan mengalami masalah ini.

Menyajikan data teks besar bukanlah penggunaan yang direncanakan.

Satu-satunya pilihan Anda adalah fungsi nilai tabel yang mengambil input teks dan memotongnya baris untuk setiap baris, sehingga Management Studio mendapatkan daftar baris, bukan satu baris.

TomTom
sumber
Saya merasa jawaban ini adalah tebakan terbaik, atau apakah Anda memiliki sumber untuk "penggunaan yang direncanakan"? Jika itu adalah "studio manajemen" SQL, itu setidaknya harus dapat menunjukkan kepada saya konten database saya. UI yang benar-benar buruk.
Sialan
Jawaban ini harus dihapus karena tidak berlaku lagi
Caius Jard