System.WebのHTTPUtility.UrlDecodeメソッドを使用してSQL CLR関数をデプロイしようとしていますが、デプロイできません。受け取ったエラー:
.Net SqlClientデータプロバイダー:メッセージ6503、レベル16、状態12、行1アセンブリ 'system.web、version = 4.0.0.0、culture = neutral、publickeytoken = b03f5f7f11d50a3a。' SQLカタログで見つかりませんでした。
機能(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);
}
}
これは thread に関連しています。私はVS2012 SSDTとデータベースプロジェクトを備えたSQL Server 2014です。他のターゲットフレームワーク(3、3.5、4、4.5など)で試した。
また、System.WebでCREATE Assemblyを試しましたが、失敗するまでMicrosoft.Build、System.Xamlなどの他のアセンブリを追加する必要があります。 System.Webが Supported Libraries のリストにないので、アイデアはありますか?
ri.UnescapeDataString (System
内)を使用することもできます。その場合、文字列に対してReplace('+', ' ')
も実行する必要がありますbefore をUri.UnescapeDataString
に渡すか、または気にしない場合、この関数は無料バージョンの SQL# で使用できます(これは私が作者です) )。
System.Web
のインポートは、おそらくそれ以上の作業になります。そして実際には、それは危険を伴う可能性があります。質問でリンクした「サポートされているライブラリ」リストにSystem.Web
が含まれていないことには十分な理由があります:動作が保証されていません!特にUS以外のASCII文字セットを処理する場合、期待どおりに動作せず、Microsoftが修正しない)状況に遭遇する可能性があります。したがって、絶対にする必要があります。サポートされていないDLLを追加する場合は注意が必要です。「サポートされている」リストのDLLは、SQL Server照合およびその他の環境問題で機能するように完全にテストおよび検証されていますWindowsで実行されている標準のCLRとSQL Server内で実行されているCLRとは異なります。
サポートされていない.NET Frameworkライブラリを組み込むためのいくつかの落とし穴に関するMicrosoftからの追加リソースがあります。
コードに関する注意事項:
string encodedXML
をSqlString encodedXML
に変更します。SqlFunction
属性にIsDeterministic = true
を追加します。お気づきのように、System.Web
はサポートされていないライブラリです。 System.Web
を参照するには、CREATE Assembly
を呼び出す必要があります。試したようですが、System.Web.dll
の場所をどのように参照しましたか?別の場所にコピーして貼り付けましたか? SQL Serverは、依存するアセンブリを同じ場所に配置しようとします。つまり、System.Web.dll
の場所を、同じディレクトリにある他のすべての依存ライブラリで参照すると、問題なく機能するはずです。これが実際の例です。 System.Web
アセンブリとアセンブリの両方を追加できました:
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
クライアントメッセージから、SQL Serverがロードする他のすべてのアセンブリを確認できます。ただし、SQL Serverはこれらのそれぞれについて次の警告を表示します。
登録しているのは、SQL Serverのホスト環境で完全にテストされておらず、サポートされていません。将来、このアセンブリまたは.NET Frameworkをアップグレードまたはサービスすると、CLR統合ルーチンが機能しなくなる可能性があります。詳細については、SQL Server Books Onlineを参照してください。
同様に、System.Web
を追加して、追加された次のアセンブリを見てください。
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
ここで実際に何が起こっているかについて注意する価値があります。other追加のアセンブリにT-SQLエントリポイントの方法がない場合でも、今は依存関係です。 本当にSystem.Web
を参照する必要があるか、または別のルートがあるかどうかを確認するために、オプションを比較検討しますあなたが望むものを達成するために。
チェックアウト この答え 。 Uri.UnescapeDataString
またはSystem.Web
を使用する必要はありません。関数WebUtility
およびHtmlEncode
を含むSystem.Net
の内部にHtmlDecode
というクラスがあります。