Apakah ada cara yang lebih mudah untuk menyelesaikan ketidaksesuaian pengumpulan SQL Server / basis data daripada mengubah setiap kolom?

8

PENOLAKAN: Saya tahu bahwa pertanyaan ini telah ditanyakan ratusan kali sebelumnya, tetapi saya hanya ingin memeriksa bahwa tidak ada solusi yang lebih mudah yang mungkin saya lewatkan sebelum saya melanjutkan dan menulis / mengambil banyak kode untuk melakukannya.

Perangkat lunak kami menggunakan database yang awalnya dirancang untuk SQL Server 7, dan karenanya, semua skrip yang membuatnya tidak menentukan susunan eksplisit apa pun untuk kolom karakter apa pun. Sebaliknya, ketika database dibuat / dikembalikan ke SQL Server 2000 atau di atasnya, setiap kolom mewarisi susunan basis data (yang kebetulan SQL_Latin1_General_CP1_CI_ASsejak itu adalah SQL Server 7 default).

Secara teoritis, ini tidak terlalu menjadi masalah, karena jika basis data kami dibuat dari awal pada server pelanggan, itu mewarisi susunan server pelanggan (yang biasanya merupakan standar instalasi modern Latin1_General_CP1_CI_AS) , dan semuanya berjalan dengan baik. Namun, skenario ini rusak ketika mereka mengirimi kami cadangan basis data, atau kami mengirim mereka cadangan basis data, dan kami atau mereka mendapatkan kesalahan ketidakcocokan susunan yang ditakuti setiap kali kode mencoba mengakses tabel temp dll

Kami telah mencoba mendidik pelanggan untuk menginstal atau membangun kembali contoh SQL Server mereka untuk menggunakan susunan pilihan kami, tetapi tentu saja itu tidak selalu terjadi dan itu tidak selalu mungkin.

Solusi yang melibatkan pembuatan database baru dan menyalin data tidak benar-benar praktis bagi kami, kami memerlukan "tongkat ajaib" yang dapat kami lambaikan pada database langsung untuk memperbaiki semua kolom di tempat tanpa mengganggu data. Saya berpikir untuk menulis utilitas untuk melakukan ini, tetapi karena ini akan menjadi pekerjaan yang cukup besar, apakah ada yang punya saran yang lebih sederhana?

Christian Hayter
sumber

Jawaban:

6

Salah satu opsi adalah "membuktikan" kode Anda terhadap ketidaksesuaian collation.

Anda dapat menggunakan susunan khusus "DATABASE_DEFAULT" untuk memaksa tanpa mengetahui apa susunan sebenarnya. Anda menggunakannya pada kolom tipe char di tabel temp, variabel tabel dan tabel sistem yang perlu Anda gunakan.

Contoh:

CREATE TABLE #Currency (CCY CHAR(3))
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --error!
GO
-- in join too
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY COLLATE DATABASE_DEFAULT --no error
GO
DROP TABLE #Currency
GO


CREATE TABLE  #Currency (CCY CHAR(3) COLLATE DATABASE_DEFAULT)
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --no error!
GO

DROP TABLE #Currency
GO

Ini juga berarti bahwa ketika klien Anda memigrasi DB mereka ke kotak SQL Server whizzy baru dengan pemeriksaan lain yang berbeda, itu juga berfungsi ...

gbn
sumber
2

Jawaban singkatnya adalah tidak ada cara yang mudah. Saya pernah mengalami masalah yang sama di masa lalu.

Apa yang akan saya katakan adalah 2 hal, pertama ketika pelanggan Anda mengirimkan Anda sebuah database dengan susunan tak terduga, instal contoh SQL baru dengan susunan standar yang cocok dengan DB mereka dan bekerja dengannya dalam hal itu.

Yang kedua adalah pastikan aplikasi Anda akan bekerja dengan collations lain kemudian default (karena itu bisa berubah di masa depan) dan bekerja dengan benar selama collation pada SQL server dan DB cocok. Maka itu cukup mudah untuk memiliki pelanggan menginstal SQL server dengan susunan yang cocok dengan DB mereka dan kemudian akan berfungsi.

Atau tulis utilitas yang akan memperbarui semua tabel, dll di basis data Anda seperti yang Anda katakan, tetapi itu mungkin lebih banyak pekerjaan daripada yang Anda inginkan.

SpaceManSpiff
sumber
2

Jika semua kolom dalam database memiliki susunan yang sama, maka itu hanya akan menimbulkan masalah bagi Anda saat membuat kueri lintas basis data (atau aplikasi Anda sensitif terhadap urutan).

Titik lengket datang ketika Anda menyadari bahwa bergabung ke tabel sementara adalah database-silang, karena mereka berada di tempdb. Itu mudah untuk disortir - pastikan saja bahwa kolom teks dalam tabel sementara secara eksplisit dibuat dengan COLLATE database_defaultarahan. Ini berarti bahwa kolom akan dibuat dengan susunan standar basis data saat ini dan bukan koleksi standar tempdb (yang akan sama dengan standar server).

David Spillett
sumber