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?

wBob
sumber

Jawaban:

9

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:


Beberapa catatan tentang kode Anda:

  1. Tolong jangan gunakan tipe .NET untuk parameter, input atau output. Oleh karena itu, ubahlah string encodedXMLmenjadi SqlString encodedXML.
  2. Fungsi ini bersifat deterministik sehingga harus ditandai seperti itu, jika tidak, Anda akan mengalami hit performa. Tambahkan IsDeterministic = trueke SqlFunctionatribut.
Solomon Rutzky
sumber
8

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:

create assembly [System.Web]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with permission_set = unsafe;
go

create assembly SystemWebTest
from 'c:\SqlServer\SystemWebTest.dll'
with permission_set = safe;
go

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:

select
    name,
    permission_set_desc,
    is_visible
from sys.assemblies
where is_user_defined = 1
order by is_visible desc;

name                                            permission_set_desc is_visible
System.Web                                      UNSAFE_ACCESS       1
SystemWebTest                                   SAFE_ACCESS         1
Microsoft.Build.Framework                       UNSAFE_ACCESS       0
System.Xaml                                     UNSAFE_ACCESS       0
System.ComponentModel.DataAnnotations           UNSAFE_ACCESS       0
System.Runtime.Caching                          UNSAFE_ACCESS       0
System.Web.ApplicationServices                  UNSAFE_ACCESS       0
System.Drawing                                  UNSAFE_ACCESS       0
Microsoft.Build.Utilities.v4.0                  UNSAFE_ACCESS       0
System.DirectoryServices                        UNSAFE_ACCESS       0
System.DirectoryServices.Protocols              UNSAFE_ACCESS       0
System.EnterpriseServices                       UNSAFE_ACCESS       0
System.Runtime.Remoting                         UNSAFE_ACCESS       0
System.Runtime.Serialization.Formatters.Soap    UNSAFE_ACCESS       0
System.Design                                   UNSAFE_ACCESS       0
System.Windows.Forms                            UNSAFE_ACCESS       0
Accessibility                                   UNSAFE_ACCESS       0
System.Drawing.Design                           UNSAFE_ACCESS       0
System.Web.RegularExpressions                   UNSAFE_ACCESS       0
Microsoft.Build.Tasks.v4.0                      UNSAFE_ACCESS       0
System.ServiceProcess                           UNSAFE_ACCESS       0
System.Configuration.Install                    UNSAFE_ACCESS       0
System.Runtime.Serialization                    UNSAFE_ACCESS       0
System.ServiceModel.Internals                   UNSAFE_ACCESS       0
SMDiagnostics                                   UNSAFE_ACCESS       0

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.

Thomas Stringer
sumber
1
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.

skeletank
sumber
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?
skeletank
Artikel saya diterbitkan hari ini sehingga sekarang ada grafik yang menunjukkan hubungan antara versi SQL Server dan fitur SQLCLR (termasuk versi Framework dan CLR): Stairway to SQLCLR Level 5: Pengembangan (Menggunakan .NET dalam SQL Server) (diperlukan pendaftaran gratis ).
Solomon Rutzky