Saya memiliki sumber database PostgreSQL lama (ODBC) yang saya coba migrasi ke skema SQL Server baru menggunakan SSIS. Saya mendapat peringatan yang mengatakan:
Metode pengambilan 'Baris demi baris' diberlakukan karena tabel memiliki kolom LOB. Konten kolom adalah LOB
Masalahnya, tidak ada kolom yang benar - benar perlu menjadi LOB. Ada beberapa yang merupakan tipe TEKS, tetapi bisa dengan mudah masuk dalam varchar (maks). Bahkan orang asing, meskipun, sebagian besar sudah berada varchars, tetapi tampaknya apa pun lebih varchar (128) sedang diperlakukan seolah-olah itu adalah LOB (dalam sifat muka, jenis data DT_NTEXT).
Saya acara mencoba melakukan perintah SQL manual di mana saya secara eksplisit melemparkan setiap tipe string ke varchar dengan panjang yang sesuai dalam pernyataan pilih, dan mereka masih ditetapkan sebagai DT_NTEXT di sumber ODBC.
Saya bukan DBA, jadi sangat mungkin saya melakukan sesuatu yang sangat bodoh. Saya hanya ingin tahu cara terbaik untuk memastikan bahwa jenis berakhir sebagai varchars sehingga saya dapat mengambil batch. Ada ide?
Dalam hal ini penting, saya menggunakan SSIS-BI 2014 di dalam Visual Studio 2013.
sumber
varchar(max)
hanya singkatan untuk mengatakan bahwa data kolom dapat masuk dalam ukuran varchar maksimum, yaitu sekitar 4000, untuk tujuan SSIS, saya pikir. Saya sebenarnya tidak melakukan apa pun untukvarchar(max)
; Namun, saya memang melemparkan beberapa kolom kevarchar(4000)
, hanya untuk aman.Jawaban:
Tampaknya ini hanya bermuara pada SSIS yang memperlakukan varchar yang lebih besar dari 128 sebagai NTEXT. Tidak yakin kenapa. Namun, saya bisa masuk ke properti lanjutan dari sumber ODBC dan mengubah jenis kembali ke sesuatu seperti DT_WSTR. Yang tampaknya bekerja sebagian besar.
Namun, saya memang menentukan bahwa beberapa tabel yang saya hadapi sebenarnya membawa hingga 4000 byte di beberapa kolom TEXT mereka, jadi saya sayangnya harus meninggalkan kolom tersebut sebagai DT_NTEXT untuk mencegah pemotongan (SSIS tidak akan membiarkan Anda menetapkan tipe DT_WSTR dengan lebih dari 4000 byte). Saya kira dalam contoh ini, saya hanya terjebak dengan pengambilan baris demi baris, tapi setidaknya saya bisa memperbaiki beberapa tabel.
sumber
Saya menggunakan Konversi Data untuk varchar yang lebih besar dari 128 sebagai NTEXT tetapi yang akhirnya menghapus kesalahan bagi saya adalah set Validate External Data to False.
sumber
Solusi ini bekerja untuk saya:
Saya menghapus kesalahan dengan mengubah parameter Max Varchar di properti sumber data. Buka pengelola koneksi. Pilih opsi build di sebelah string koneksi. Klik pada tombol koneksi untuk mengakses lebih banyak opsi. Ubah nilai Max Varchar.
sumber
Dalam kasus saya, sumbernya adalah Filemaker ODBC yang juga memperlakukan teks panjang sebagai tipe data LOB. Paket saya digunakan untuk menggantung untuk waktu yang lama karena penurunan ekstrim dalam kinerja untuk metode pengambilan Baris demi Baris diberlakukan karena tabel memiliki kolom LOB. Dengan demikian, ketika sedang digunakan biasanya habis setelah waktu yang lama dan akhirnya gagal.
Saya berbagi solusi aktual yang bekerja seperti pesona bagi saya. Satu hari senilai lebih dari 30k penarikan data tipe LOB memakan waktu sekitar 10 menit untuk saya ::
Turunkan DefaultBufferMaxRows ke 1 dan tingkatkan DefaultBufferSize hingga maksimum yaitu 100 MB. Kemudian ubah sumber ODBC DSN dengan mencentang opsi 'treat text as long varchar'. Dan memetakan tipe data seperti dari sumber ke target (tanpa perubahan dalam editor sumber lanjutan).
sumber