Menghindari metode pengambilan "Baris demi baris" saat berurusan dengan kolom LOB sumber

12

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.

Chris Pratt
sumber
3
Ketika Anda secara eksplisit melemparkan mereka dalam sistem sumber ke ukuran non-max, apakah itu dalam aliran data yang ada atau apakah Anda membuat yang baru, atau setidaknya komponen sumber baru untuk itu? Saat Anda memberikan kueri dengan nama kolom yang sama dan hanya tipe yang lebih kurus, beberapa kali itu tidak mendaftar sebagai perubahan sehingga editor tidak menjalankan proses pengumpulan metadata (yang bisa mahal). Juga, varchar (maks) akan diperlakukan sebagai LOB untuk aliran data SSIS dan itu dapat melukai agilebi.com/jwelch/2010/05/11/…
billinkc
Di komponen sumber data ODBC, Anda memiliki opsi untuk memilih tabel atau menggunakan kueri. Di situlah saya melakukan casting: dalam permintaan khusus. Saya sebutkan 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 untuk varchar(max); Namun, saya memang melemparkan beberapa kolom ke varchar(4000), hanya untuk aman.
Chris Pratt

Jawaban:

3

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.

Chris Pratt
sumber
3

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.

ceci
sumber
0

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.

masukkan deskripsi gambar di sini

Karbon 4 kuda
sumber
0

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).

Shatabdi Das Chowdhury
sumber