Bermigrasi dari teks dan gambar ke varchar (maks) dan varbinary (maks)

8

Saya memiliki database SQL Server yang berisi sejumlah imagedan textkolom, dan saya sedang mempelajari masalah potensial yang mungkin timbul dari migrasi mereka ke rekan varbinary(max)dan mereka yang tidak usang varchar(max).

Selain perubahan kode aplikasi, perhatian utama saya adalah "gotcha" potensial yang terkait dengan ini. Misalnya, apakah ada fungsionalitas yang didukung oleh tipe data yang lebih lama tetapi tidak pada yang baru?

Kehilangan data karena pemotongan setidaknya tampaknya tidak menjadi masalah karena jenis baru setidaknya sebesar yang lama.

Pertemuan
sumber

Jawaban:

11

Sekedar catatan: tipe data baru ini mendukung ukuran yang sama dengan tipe yang sudah usang yang mereka gantikan, misalnya data 2GB (yang berarti jumlah karakter yang berbeda tergantung pada Unicode dan faktor lainnya).

Satu hal yang pasti adalah Anda harus mengurai semua kode yang ada aplikasi, disimpan prosedur, fungsi dll untuk contoh built-in seperti UPDATETEXT, READTEXT, TEXTPTR, WRITETEXT, TEXTSIZEdan @@TEXTSIZE- yang semuanya mungkin harus diubah. Anda dapat mengidentifikasi yang tersimpan di SQL Server dengan cara ini:

SELECT s.name, o.name
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE UPPER(m.definition) LIKE N'%UPDATETEXT%'
     OR UPPER(m.definition) LIKE N'%WRITETEXT%'
     OR UPPER(m.definition) LIKE N'%READTEXT%'
     OR UPPER(m.definition) LIKE N'%TEXTPTR%'
     OR UPPER(m.definition) LIKE N'%TEXTSIZE%';

Perhatikan bahwa ini dapat menghasilkan false positive (mis. Istilah-istilah itu mungkin dalam komentar atau secara alami terjadi dalam nama entitas) dan itu bisa kehilangan beberapa (misalnya perintah dapat dibangun menggunakan parameter / SQL dinamis). Anda sendirian untuk mencari basis kode aplikasi Anda dan / atau kontrol sumber untuk contoh yang sama.

Pastikan juga Anda menemukan semua modul yang menerima atau menampilkan parameter jenis ini:

SELECT DISTINCT s.name, o.name
  FROM sys.parameters AS p
  INNER JOIN sys.objects AS o
  ON p.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE system_type_id IN (34,35,99);

Anda mungkin juga ingin mempertimbangkan bahwa Anda mungkin memiliki logika dalam pekerjaan dan rutinitas perawatan lainnya yang saat ini menghindari tabel ini atau memperlakukannya secara berbeda karena keterbatasan yang melekat pada tipe data ini. Ketika Anda pindah ke tipe yang lebih baru (dan terutama pada versi SQL Server paling modern), banyak keterbatasan ini hilang.

Akhirnya, selain sintaks di atas, saya tidak bisa memikirkan satu fitur yang didukung tipe lama yang tidak dimiliki tipe baru.

Aaron Bertrand
sumber
2

Kami telah melalui ini tanpa masalah. Di mana pun Anda memperbarui atau memasukkan data, pastikan itu adalah memasukkan / memperbarui tradisional dan bahwa Anda tidak menggunakan WRITETEXT atau UPDATETEXT.
Selain itu, semuanya harus bekerja dengan baik.

Vic Ambruso
sumber