Saya memiliki prosedur tersimpan yang memasukkan 650 bidang ke dalam tabel. Sisipan gagal dengan kesalahan pemotongan.
Sederhana saja
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Di bawah ini adalah pesan kesalahan:
Msg 8152, Level 16, Negara 14, Prosedur DSP_Procedure, Line 1075 String atau data biner akan terpotong.
Apakah ada cara cepat untuk mengidentifikasi bidang apa yang menyebabkan kesalahan pemotongan?
Fakta bahwa pernyataan pilih yang akan dimasukkan ke dalam tabel memiliki 650 bidang membuatnya sulit untuk menentukan bidang mana yang menyebabkan kesalahan pemotongan.
Saya pikir saya mungkin dapat mengomentari blok bidang pada suatu waktu sehingga hanya memiliki SP memasukkan 100 bidang pada suatu waktu dan kemudian menjalankan SP 6 atau 7 waktu yang berbeda sampai saya setidaknya dapat mempersempit ke sekelompok 100 bidang yang akan berisi bidang yang menyebabkan kesalahan pemotongan.
Atau saya berpikir bahwa mungkin saya bisa hanya SELECT INTO
tabel baru dan kemudian membandingkan panjang data dalam tabel vs panjang data tabel target yang saya coba masukkan ke dalam SP saya untuk melihat bidang mana yang berisi panjang bidang lebih panjang dari yang diharapkan. ..
Saya menggunakan SQL Server 2014.
Adakah alternatif yang lebih mudah?
sumber
Jawaban:
Jika Anda menggunakan SQL Server 2016 (SP2, CU6 atau yang lebih baru), salah satu opsi adalah untuk mengaktifkan jejak bendera 460 misalnya
(QUERYTRACEON 460)
. Output akan menunjukkan kolom dan menyinggung data.Lihat artikel ini untuk detailnya. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
Jika Anda tidak peduli dengan pemotongan yang dapat Anda gunakan
SET ANSI_WARNINGS OFF
untuk mengabaikan pemotongan itu.sumber
Sayangnya, Anda telah menjumpai "fitur" yang cukup lama . Sudah ada tiket Connect yang dibuka sejak 2008, dan selama hampir sepuluh tahun ini belum cukup signifikan untuk menjamin perbaikan.
Solusi standarnya , seperti yang Anda bayangkan,
select into...
diikuti dengan membandingkan tabel metadata. Kemungkinan lain adalah pencarian biner pada kolom yang menyinggung, tetapi itu juga pekerjaan manual. Ada beberapa peretasan untuk perbandingan metadata, tetapi solusi sederhana dan elegan tidak ada. Mungkin beberapa alat pihak ketiga bisa membantu, tapi saya tidak menyadarinya.sumber
Menggunakan (QUERYTRACEON 460) tidak berfungsi untuk saya saat meletakkannya di akhir permintaan saya.
Saya menyalakannya di tingkat DB dan berhasil:
Tapi, pastikan untuk mematikannya setelah Anda menemukan dan memperbaiki masalah, jangan biarkan!
sumber