Majelis 'system.web, versi = 4.0.0.0, budaya = netral, publickeytoken = b03f5f7f11d50a3a.' tidak ditemukan dalam katalog SQL
9
Saya mencoba untuk menggunakan fungsi SQL CLR menggunakan metode HTTPUtility.UrlDecode dari System.Web tapi saya tidak bisa menggunakannya. Kesalahan diterima:
. Penyedia Data SqlClient Net: Msg 6503, Level 16, State 12, Line 1 Assembly 'system.web, versi = 4.0.0.0, culture = neutral, publickeytoken = b03f5f7f11d50a3a.' tidak ditemukan dalam katalog SQL.
Fungsi (sebagai bagian dari proyek SSDT):
using System;using System.Web;using System.Data;using System.Data.SqlClient;using System.Data.SqlTypes;using Microsoft.SqlServer.Server;public partial class UserDefinedFunctions{[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]public static SqlString udf_UrlDecode(SqlString encodedXML){
string decodedXML;
decodedXML = HttpUtility.UrlDecode(encodedXML.ToString());return new SqlString(decodedXML);}}
Ini terkait dengan utas ini . Saya SQL Server 2014 dengan VS2012 SSDT dan Proyek Database. Telah mencoba dengan Kerangka Sasaran lainnya, misalnya 3, 3.5, 4 dan 4.5.
Saya juga telah mencoba MENCIPTAKAN PERAKITAN dengan System.Web, tetapi kemudian harus menambahkan rakitan lain, misalnya Microsoft.Build, System.Xaml sampai mereka juga gagal. Saya melihat System.Web tidak ada dalam daftar Perpustakaan yang Didukung sehingga ada ide?
Anda bisa menggunakan Uri.UnescapeDataString (dalam System), dalam hal ini Anda juga perlu melakukan Replace('+', ' ')pada string sebelum meneruskannya Uri.UnescapeDataString, atau jika Anda lebih suka tidak repot dengan itu, fungsi ini tersedia dalam versi gratis dari SQL # (yang saya penulis).
Mengimpor System.Webmungkin lebih banyak pekerjaan daripada nilainya. Dan faktanya, itu bisa berisiko. Ada alasan bagus yang System.Webtidak ada dalam daftar "Perpustakaan yang Didukung" yang Anda tautkan dalam pertanyaan: itu tidak dijamin berfungsi! Anda mungkin mengalami situasi, terutama ketika berhadapan dengan set karakter ASCII non-AS, yang tidak berperilaku seperti yang diharapkan, dan Microsoft tidak akan memperbaikinya. Jadi, kecuali Anda benar - benar harus melakukannya, Anda harus berhati-hati dalam menambahkan DLL yang tidak didukung. DLL dalam daftar "Yang Didukung" telah sepenuhnya diuji dan diverifikasi untuk bekerja dengan susunan SQL Server dan masalah lingkungan lainnya yang berbeda antara CLR standar yang berjalan di Windows dan CLR yang berjalan di dalam SQL Server.
Berikut adalah beberapa sumber daya tambahan dari Microsoft mengenai beberapa jebakan untuk menggabungkan pustaka .NET Framework yang tidak didukung:
Tolong jangan gunakan tipe .NET untuk parameter, input atau output. Oleh karena itu, ubahlah string encodedXMLmenjadi SqlString encodedXML.
Fungsi ini bersifat deterministik sehingga harus ditandai seperti itu, jika tidak, Anda akan mengalami hit performa. Tambahkan IsDeterministic = trueke SqlFunctionatribut.
Seperti yang telah Anda catat, System.Webadalah perpustakaan yang tidak didukung. Untuk referensi, System.WebAnda perlu menelepon CREATE ASSEMBLY. Sepertinya Anda sudah mencobanya, tapi bagaimana Anda merujuk lokasi System.Web.dll? Apakah Anda menyalin / menempelnya ke lokasi yang berbeda? SQL Server akan mencoba menemukan majelis dependen di lokasi yang sama. Dengan kata lain, jika Anda merujuk lokasi System.Web.dlldengan semua pustaka dependen lainnya yang tinggal di direktori yang sama, itu akan berfungsi dengan baik. Berikut ini contoh kerjanya. Saya dapat menambahkan System.Webrakitan sekaligus rakitan Anda:
Anda bisa melihat dari pesan klien semua majelis lain yang memuat SQL Server. Tetapi perhatikan, SQL Server menampilkan peringatan berikut untuk masing-masing:
Anda mendaftar tidak sepenuhnya diuji di lingkungan yang dihosting SQL Server dan tidak didukung. Di masa depan, jika Anda meningkatkan atau memperbaiki perakitan ini atau .NET Framework, rutin integrasi CLR Anda mungkin berhenti bekerja. Silakan merujuk SQL Server Books Online untuk lebih jelasnya.
Demikian juga, tetapi menambahkan System.Web, lihatlah rakitan berikut yang ditambahkan:
Perlu diperhatikan tentang apa yang sebenarnya terjadi di sini, dan meskipun majelis tambahan lainnya tidak memiliki cara untuk titik masuk T-SQL, mereka sekarang menjadi ketergantungan. Saya akan mempertimbangkan opsi untuk melihat apakah Anda benar-benar perlu referensiSystem.Web , atau jika ada rute lain untuk mencapai apa yang Anda inginkan.
Terima kasih Thomas, itu berhasil. Saya sedang mencoba MENCIPTAKAN PERAKITAN yang menunjuk pada System.Web.dll yang ditulis melalui GUI. Saya sedang bereksperimen dengan ini sebagai jawaban untuk posting newsgroup (ditautkan sebelumnya), jadi tidak ada keinginan untuk menggunakannya sendiri.
wBob
1
@ wBob: kecuali Anda benar-benar harus, Anda harus berhati-hati menambahkan DLL yang tidak didukung. Ada alasan bagus yang System.Webtidak ada dalam daftar "Perpustakaan yang Didukung" yang Anda tautkan: tidak dijamin berfungsi! . Anda mungkin mengalami situasi, terutama ketika berhadapan dengan set karakter ASCII non-AS, yang tidak berperilaku seperti yang diharapkan, dan Microsoft tidak akan memperbaikinya. Saya akan menambahkan catatan tentang ini dalam jawaban saya hanya untuk menjadi jelas bagi mereka yang mungkin tidak tahu.
Solomon Rutzky
@rutzky saya setuju.
wBob
1
Anda adalah penyelamat hidup. Saya akan menjadi SOL jika saya tidak dapat mengimpor perpustakaan ini. (Ini salah satu dari kasus yang sangat langka.)
devinbost
5
Lihatlah jawaban ini . Anda tidak harus menggunakan Uri.UnescapeDataStringatau System.Web. Ada kelas yang disebut WebUtilitybagian dalam System.Netdengan fungsi HtmlEncodedan HtmlDecode.
Anda harus menunjukkan bahwa WebUtilityini hanya tersedia bagi mereka yang menggunakan SQL Server 2012, 2014, atau yang lebih baru. Yang masih di SQL Server 2005, 2008, dan 2008 R2 tidak akan dapat menggunakan ini karena diperkenalkan di .NET Framework 4.0.
Solomon Rutzky
@srutzky Pertanyaannya adalah untuk tahun 2014 tetapi penting untuk memberi tahu pengguna tentang batasan ini. Apakah Anda memiliki tautan yang dapat saya posting yang menunjukkan hubungan antara versi .NET Framework dan versi SQL Server?
System.Web
tidak ada dalam daftar "Perpustakaan yang Didukung" yang Anda tautkan: tidak dijamin berfungsi! . Anda mungkin mengalami situasi, terutama ketika berhadapan dengan set karakter ASCII non-AS, yang tidak berperilaku seperti yang diharapkan, dan Microsoft tidak akan memperbaikinya. Saya akan menambahkan catatan tentang ini dalam jawaban saya hanya untuk menjadi jelas bagi mereka yang mungkin tidak tahu.Lihatlah jawaban ini . Anda tidak harus menggunakan
Uri.UnescapeDataString
atauSystem.Web
. Ada kelas yang disebutWebUtility
bagian dalamSystem.Net
dengan fungsiHtmlEncode
danHtmlDecode
.sumber
WebUtility
ini hanya tersedia bagi mereka yang menggunakan SQL Server 2012, 2014, atau yang lebih baru. Yang masih di SQL Server 2005, 2008, dan 2008 R2 tidak akan dapat menggunakan ini karena diperkenalkan di .NET Framework 4.0.