Tidak, ini tidak dicatat di mana pun. Pergi memilih dan nyatakan kasus bisnis Anda; ini adalah salah satu dari daftar panjang hal-hal yang harus diperbaiki di SQL Server.
Ini diminta tahun lalu di Connect (mungkin pertama kali dalam jangka waktu SQL Server 2000 atau 2005), kemudian lagi pada sistem umpan balik baru:
Dan sekarang telah dikirim, di SQL Server 2019 , SQL Server 2017 CU12, dan akan muncul di SQL Server 2016 SP2 CU di masa depan.
Dalam CTP publik pertama dari SQL Server 2019, itu hanya muncul di bawah bendera jejak 460. Ini kedengarannya agak rahasia, tetapi diterbitkan dalam whitepaper Microsoft ini . Ini akan menjadi perilaku default (tidak ada tanda jejak diperlukan) ke depan, meskipun Anda akan dapat mengontrol ini melalui konfigurasi cakupan database baru VERBOSE_TRUNCATION_WARNINGS
.
Berikut ini sebuah contoh:
USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));
INSERT dbo.x(a) VALUES('foo');
GO
Menghasilkan semua versi yang didukung sebelum SQL Server 2019:
Msg 8152, Level 16, State 30, Line 5
String atau data biner akan terpotong.
Pernyataan itu telah dihentikan.
Sekarang, di SQL Server 2019 CTP, dengan tanda jejak diaktifkan:
DBCC TRACEON(460);
GO
INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);
Hasil menunjukkan tabel, kolom, dan nilai ( terpotong , tidak penuh ):
Msg 2628, Level 16,
Status 1, Baris 11
String atau data biner akan terpotong di tabel 'tempdb.dbo.x', kolom 'a'. Nilai terpotong: 'f'.
Pernyataan itu telah dihentikan.
Sampai Anda dapat membuang semuanya dan meningkatkan ke SQL Server 2019, atau pindah ke Azure SQL Database, Anda dapat mengubah kode "automagic" Anda untuk benar-benar menarik max_length dari sys.columns
, bersama dengan nama yang harus Anda tuju di sana, dan kemudian menerapkan LEFT(column, max_length)
atau apa pun yang setara dengan PG. Atau, karena itu berarti Anda akan secara diam-diam kehilangan data, cari tahu kolom apa yang tidak cocok dan perbaiki kolom tujuan sehingga cocok dengan semua data dari sumber. Diberikan akses metadata ke kedua sistem, dan fakta bahwa Anda sudah menulis kueri yang harus secara otomatis mencocokkan sumber -> kolom tujuan (jika tidak, kesalahan ini tidak akan menjadi masalah terbesar Anda), Anda tidak harus melakukan brute-force menebak sama sekali.
sys.columns
karena saya sama sekali tidak tahu kode apa yang saat ini Anda gunakan untuk "secara otomatis" menghasilkan pertanyaan Anda. Sebenarnya tidak terlalu rumit yang bisa saya tebak untuk dimasukkan ke dalam kode AndaSELECT name, object_id, max_length FROM sys.columns;
. Karena Anda sudah memiliki kode automagic yang harus melakukan ini - atau sesuatu yang sangat mirip - saya tidak berpikir contoh diperlukan.sys.columns
kerjanya dengan dua kolom yang samaname
. Juga, saya mendapatkan hal yang berfungsi menggunakan perpustakaan daripadasys
, mengapa saya menjadikan itu sebagai jawaban yang dipilih?Microsoft SQL doesn't have x, do y instead
adalah kontribusi yang valid, tetapi jika Anday
lebih rendah dari sayay
, saya akan melakukan sesuatu yang berbeda dan menandainya sebagai yang dipilih.Akhirnya Microsoft telah memutuskan untuk memberikan informasi yang bermakna untuk
String or binary would be truncated
mulai dari SQL Server 2016 SP2 CU, SQL Server 2017 CU12 dan dalam SQL Server 2019.Informasi itu sekarang termasuk kolom tabel yang menyinggung (nama yang memenuhi syarat penuh) dan nilai yang menyinggung (terpotong pada 120 karakter):
sumber