Saya terlibat dalam proyek migrasi data. Saya mendapatkan kesalahan berikut ketika saya mencoba memasukkan data dari satu tabel ke tabel lain (SQL Server 2005):
Msg 8152, Level 16, Status 13, Baris 1
String atau data biner akan terpotong.
Kolom data sumber cocok dengan tipe data dan berada dalam definisi panjang kolom tabel tujuan jadi saya bingung apa yang bisa menyebabkan kesalahan ini.
sql-server
tsql
sql-server-2005
migration
data-migration
Jim Evans
sumber
sumber
Jawaban:
Anda perlu memposting definisi tabel untuk tabel sumber dan tujuan agar kami dapat mengetahui di mana masalahnya tetapi intinya adalah bahwa salah satu kolom Anda di tabel sumber lebih besar dari kolom tujuan Anda . Bisa jadi Anda mengubah format dengan cara yang tidak Anda sadari. Model basis data yang Anda pindahkan penting untuk menentukannya juga.
sumber
Seperti yang telah dikatakan orang lain, salah satu dari kolom tipe data Anda di tabel sumber lebih besar dari kolom tujuan Anda.
Solusi sederhana adalah dengan mematikan peringatan dan membiarkan pemotongan terjadi. Jadi, jika Anda menerima kesalahan ini tetapi Anda yakin itu dapat diterima untuk data dalam database / tabel lama Anda akan dipotong (dipotong menurut ukuran) Anda cukup melakukan hal berikut;
Seperti di atas, selalu ingat untuk mengaktifkan kembali peringatan setelahnya. Saya harap ini membantu.
sumber
Masalahnya cukup sederhana: satu atau lebih kolom di kueri sumber berisi data yang melebihi panjang kolom tujuan. Solusi sederhana adalah mengambil kueri sumber Anda dan mengeksekusi
Max(Len( source col ))
pada setiap kolom. Yaitu,Kemudian bandingkan panjang tersebut dengan panjang tipe data di tabel tujuan Anda. Paling tidak satu, melebihi panjang kolom tujuan.
Jika Anda benar-benar yakin bahwa ini tidak boleh terjadi dan tidak peduli jika bukan itu masalahnya , maka solusi lain adalah dengan secara paksa melemparkan kolom kueri sumber ke panjang tujuan mereka (yang akan memotong data apa pun yang terlalu panjang):
sumber
SQL Server 2019 akhirnya akan mengembalikan pesan kesalahan yang lebih bermakna.
Untuk mengaktifkan perilaku baru yang perlu Anda gunakan
DBCC TRACEON(460)
. Teks kesalahan baru darisys.messages
:Data String atau Binary akan terpotong: mengganti kesalahan yang terkenal 8152
SQL Server 2017 CU12 juga mendukung fitur ini.
Peningkatan: Penggantian opsional untuk pesan "Data string atau biner akan terpotong" dengan informasi tambahan di SQL Server 2017
db <> demo biola
sumber
Salah satu alasan potensial lainnya untuk hal ini adalah jika Anda memiliki pengaturan nilai default untuk kolom yang melebihi panjang kolom. Tampaknya seseorang gemuk meraba kolom yang memiliki panjang 5 tetapi nilai default melebihi panjang 5. Ini membuat saya gila ketika saya mencoba untuk memahami mengapa itu tidak bekerja pada insert apa pun, bahkan jika semua yang saya masukkan adalah satu kolom dengan bilangan bulat dari 1. Karena nilai default pada skema tabel memiliki yang melanggar nilai default itu mengacaukan semuanya - yang saya kira membawa kita ke pelajaran yang dipetik - hindari memiliki tabel dengan nilai default di skema. :)
sumber
Untuk yang lain, periksa juga prosedur tersimpan Anda . Dalam kasus saya dalam prosedur tersimpan
CustomSearch
saya secara tidak sengaja menyatakan tidak cukup panjang untuk kolom saya, jadi ketika saya memasukkan data besar saya menerima kesalahan itu meskipun saya memiliki panjang yang besar pada database saya. Saya baru saja mengubah panjang kolom saya di pencarian kustom saya kesalahan hilang. Ini hanya untuk pengingat. Terima kasih.sumber
Ini bisa menjadi kesalahan yang menantang. Berikut adalah beberapa catatan yang diambil dari https://connect.microsoft.com/SQLServer/feedback/details/339410/ lihat komentar AmirCharania.
Saya telah menyesuaikan jawaban yang diberikan oleh AmirCharania untuk data yang dipilih ke tabel aktual, bukan temp. Pertama-tama pilih dataset Anda ke dalam tabel pengembangan kemudian jalankan yang berikut:
sumber
Ini jawaban yang sedikit berbeda. Nama & panjang kolom Anda mungkin cocok, tetapi mungkin Anda menentukan kolom dengan urutan yang salah dalam pernyataan SELECT Anda. Katakanlah tableX dan tableY memiliki kolom dengan nama yang sama, tetapi dalam urutan yang berbeda
sumber
Saya menemukan masalah ini hari ini, dan dalam pencarian saya untuk jawaban atas pesan kesalahan informatif minimal ini saya juga menemukan tautan ini:
https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name
Jadi sepertinya microsoft tidak memiliki rencana untuk memperluas pesan kesalahan dalam waktu dekat.
Jadi saya beralih ke cara lain.
Saya menyalin kesalahan untuk unggul:
(1 baris terpengaruh)
(1 baris terpengaruh)
(1 baris terpengaruh) Msg 8152, Level 16, State 14, Line 13 String atau data biner akan terpotong. Pernyataan itu telah dihentikan.
(1 baris terpengaruh)
menghitung jumlah baris dalam excel, harus menutup ke catatan catatan yang menyebabkan masalah ... menyesuaikan kode ekspor saya untuk mencetak SQL dekat dengan itu ... kemudian jalankan sisipan 5 - 10 sql di sekitar masalah sql dan berhasil menentukan satu masalah, melihat string yang terlalu panjang, menambah ukuran kolom itu dan kemudian file impor besar berjalan tanpa masalah.
Sedikit peretasan dan solusi, tetapi ketika Anda pergi dengan pilihan yang sangat sedikit Anda melakukan apa yang Anda bisa.
sumber
Ya, saya juga menghadapi masalah seperti ini.
Di sini, saya telah mengubah REMARKS yang diajukan dari 500 menjadi 1000
sumber
Saya akan menambahkan satu kemungkinan penyebab lain dari kesalahan ini hanya karena tidak ada yang menyebutkannya dan mungkin membantu beberapa orang di masa depan (karena OP telah menemukan jawabannya). Jika tabel yang Anda masukkan memiliki pemicu, bisa jadi pemicu menghasilkan kesalahan. Saya telah melihat ini terjadi ketika definisi bidang tabel diubah, tetapi tabel audit tidak.
sumber
Yap - "satu liter ke dalam panci setengah liter tidak akan pergi". Saya tidak beruntung (dengan alasan apa pun) dengan berbagai SP yang disarankan orang, TAPI selama dua tabel dalam DB yang sama (atau Anda dapat memasukkannya ke dalam DB yang sama), Anda dapat menggunakan INFORMATION_SCHEMA. COLUMNS untuk menemukan bidang yang salah, dengan demikian:
Ini akan memungkinkan Anda menggulir ke atas dan ke bawah, membandingkan panjang bidang saat Anda pergi. Bagian yang dikomentari membuat Anda melihat (setelah tidak dicommentasikan, jelas) jika ada ketidakcocokan tipe data, atau secara khusus menunjukkan yang berbeda dalam panjang bidang - karena saya terlalu malas untuk menggulir - hanya perlu diketahui bahwa semuanya didasarkan pada sumber. nama kolom yang cocok dengan target.
sumber
Saya menggunakan string kosong '' pada pembuatan tabel dan kemudian menerima kesalahan 'Msg 8152, String atau data biner akan terpotong' pada pembaruan berikutnya. Ini terjadi karena nilai pembaruan yang mengandung 6 karakter dan lebih besar dari definisi kolom yang diantisipasi. Saya menggunakan "SPACE" untuk mengatasi ini hanya karena saya tahu saya akan memperbarui secara massal setelah pembuatan data awal yaitu kolom tidak akan tetap kosong lama.
SO BIG CAVEAT DI SINI: Ini bukan solusi yang sangat licin tetapi berguna dalam kasus di mana Anda mengumpulkan satu set data misalnya untuk permintaan intelijen satu kali di mana Anda membuat tabel untuk penggalian data, menerapkan beberapa pemrosesan / interpretasi massal dan menyimpan sebelum dan sesudah hasil untuk perbandingan / penambangan nanti. Ini adalah kejadian yang sering terjadi dalam pekerjaan saya.
Anda awalnya dapat mengisi menggunakan kata kunci SPACE yaitu
Pembaruan berikutnya untuk "nama_kolom" dari 10 karakter atau kurang (pengganti yang berlaku) kemudian akan diizinkan tanpa menyebabkan kesalahan truncate. Sekali lagi, saya hanya akan menggunakan ini dalam skenario yang mirip dengan yang dijelaskan dalam peringatan saya.
sumber
Saya telah membangun prosedur tersimpan yang menganalisis tabel sumber atau kueri dengan beberapa karakteristik per kolom di antaranya panjang minimum (min_len) dan panjang maksimum (max_len).
Saya menyimpan prosedur ini di database master sehingga saya bisa menggunakannya di setiap database seperti:
Dan hasilnya adalah:
column description constraint_type fk_table fk_column pos default null data_type length precision radix is_unique min_len max_len nulls blanks numerics distincts distinct_values remarks
id_individual NULL PRIMARY KEY NULL NULL 1 NULL NO int NULL 10 10 1 1 2 0 0 70 70 Many (70) unique,all numeric,
id_brand NULL NULL NULL NULL 2 NULL NO int NULL 10 10 0 1 1 0 0 70 2 2,3 same length,all numeric, guid NULL NULL NULL NULL 3 (newid()) NO uniqueidentifier NULL NULL NULL 1 36 36 0 0 0 70 Many (70) unique,same length,
customer_id NULL NULL NULL NULL 4 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
email NULL NULL NULL NULL 5 NULL YES varchar 100 NULL NULL 0 4 36 0 0 0 31 Many (31)
mobile NULL NULL NULL NULL 6 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
initials NULL NULL NULL NULL 7 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_short NULL NULL NULL NULL 8 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_long NULL NULL NULL NULL 9 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
firstname NULL NULL NULL NULL 10 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
lastname NULL NULL NULL NULL 11 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
address NULL NULL NULL NULL 12 NULL YES varchar 100 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
pc NULL NULL NULL NULL 13 NULL YES varchar 10 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
kixcode NULL NULL NULL NULL 14 NULL YES varchar 20 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
date_created NULL NULL NULL NULL 15 (getdate()) NO datetime NULL NULL NULL 1 19 19 0 0 0 70 Many (70) unique,same length,
created_by NULL NULL NULL NULL 16 (user_name()) NO varchar 50 NULL NULL 0 13 13 0 0 0 1 loyalz-public same length,
id_location_created NULL FOREIGN KEY location id_location 17 NULL YES int NULL 10 10 0 1 1 0 0 70 2 1,2 same length,all numeric, id_individual_type NULL FOREIGN KEY individual_type id_individual_type 18 NULL YES int NULL 10 10 0 NULL NULL 70 0 0 0 NULL all null,empty,
optin NULL NULL NULL NULL 19 NULL YES int NULL 10 10 0 1 1 39 0 31 2 0,1 same length,
sumber
sp_
awalan untuk prosedur tersimpan Anda. Microsoft telah memesan awalan itu untuk penggunaannya sendiri (lihat Prosedur Penamaan yang Disimpan ) , dan Anda memang menghadapi risiko bentrokan nama suatu saat nanti. Ini juga buruk untuk kinerja prosedur tersimpan Anda . Yang terbaik adalah hanya menghindarisp_
dan menggunakan sesuatu yang lain sebagai awalan - atau tidak ada awalan sama sekali!Saya menulis prosedur penyimpanan yang berguna untuk membantu mengidentifikasi dan menyelesaikan masalah pemotongan teks (String atau data biner akan terpotong) ketika pernyataan INSERT SELECT digunakan. Ini membandingkan bidang CHAR, VARCHAR, NCHAR DAN NVARCHAR saja dan mengembalikan bidang evaluasi dengan bidang jika kemungkinan penyebab kesalahan.
KODE FUNGSI:
Untuk saat ini hanya mendukung tipe data CHAR, VARCHAR, NCHAR dan NVARCHAR . Anda dapat menemukan versi terakhir kode ini di tautan berikutnya di bawah ini dan kami saling membantu untuk memperbaikinya. GetFieldStringTruncate.sql
https://gist.github.com/jotapardo/210e85338f87507742701aa9d41cc51d
sumber
Jika Anda menggunakan SQL Server 2016-2017: untuk memperbaikinya, aktifkan jejak bendera 460
dan pastikan Anda mematikannya setelah:
sumber
sumber
ini juga dapat terjadi ketika Anda tidak memiliki izin yang memadai
sumber
Saya punya masalah serupa. Saya menyalin data dari satu tabel ke tabel yang sama dalam segala hal kecuali nama.
Akhirnya saya membuang tabel sumber ke tabel temp menggunakan pernyataan SELECT INTO.
Saya membandingkan skema tabel sumber dengan tabel temp. Saya menemukan salah satu kolom adalah
varchar(4000)
ketika saya mengharapkanvarchar(250)
.UPDATE: Masalah varchar (4000) dapat dijelaskan di sini jika Anda tertarik:
Untuk Nvarchar (Max) saya hanya mendapatkan 4000 karakter di TSQL?
Semoga ini membantu.
sumber
Kesalahan ini dilemparkan ketika kolom tabel memberi batasan [kebanyakan panjang]. . Misalnya, jika skema database untuk kolom myColumn adalah CHAR (2), maka ketika panggilan Anda dari aplikasi Anda untuk memasukkan nilai, Anda harus melewati String dengan panjang dua.
Kesalahan pada dasarnya mengatakannya; string dengan panjang tiga dan di atas tidak konsisten agar sesuai dengan batasan panjang yang ditentukan oleh skema database. Itu sebabnya SQL Server memperingatkan dan melempar kehilangan data / kesalahan pemotongan.
sumber
Silakan coba kode berikut:
sumber