アセンブリ 'system.web、version = 4.0.0.0、culture = neutral、publickeytoken = b03f5f7f11d50a3a。' SQLカタログで見つかりませんでした


9

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);
    }
}

このスレッドに関連しています。私はVS2012 SSDTとデータベースプロジェクトを備えたSQL Server 2014です。他のターゲットフレームワーク(3、3.5、4、4.5など)で試した。

System.WebでCREATE ASSEMBLYも試しましたが、失敗するまでMicrosoft.Build、System.Xamlなどの他のアセンブリを追加する必要があります。System.Webがサポート対象ライブラリのリストにないので、アイデアはありますか?

回答:


9

Uri.UnescapeDataString(in System)を使用できます。その場合Replace('+', ' ')は、文字列を渡す前にを実行する必要がありUri.UnescapeDataStringます。または、気になりたくない場合は、この関数は無料バージョンのSQL#で使用できます。(私はその著者です)。

インポートSystem.Webはおそらくそれよりも多くの作業です。そして実際には、それは危険を伴う可能性があります。System.Web質問でリンクした「サポートされているライブラリ」リストにない正当な理由があります:動作することは保証されていません!特にUS-ASCII以外の文字セットを処理する場合、期待どおりに動作せず、Microsoftが修正しない状況に遭遇する可能性があります。したがって、どうしても必要場合を除いて、サポートされていないDLLの追加には注意が必要です。「サポートされている」リストのDLLは、SQL Serverの照合順序と、Windowsで実行されている標準のCLRとSQL Serverの内部で実行されているCLRとの間で異なるその他の環境問題で動作するように完全にテストおよび検証されています。

サポートされていない.NET Frameworkライブラリを組み込むためのいくつかの落とし穴に関するMicrosoftからの追加リソースを次に示します。


コードに関する注意事項:

  1. パラメータ、入力、出力に.NETタイプを使用しないでください。したがって、に変更string encodedXMLしますSqlString encodedXML
  2. この関数は確定的であるため、そのようにマークする必要があります。そうしないと、パフォーマンスに影響が出ます。属性に追加IsDeterministic = trueSqlFunctionます。

8

ご指摘のとおり、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

ここで実際に何が起こっているかについて注意する価値があります。他の追加のアセンブリにはT-SQLエントリポイントの方法がない場合でも、それらは依存関係になっています。本当にSystem.Web参照する必要があるかどうか、または目的を達成するための別のルートがあるかどうかを確認するために、オプションを比較検討します。


1
Thomasさん、ありがとうございました。GUIを介してスクリプト化されたSystem.Web.dllを指すCREATE ASSEMBLYを試みました。私はこれを(以前にリンクされた)ニュースグループの投稿への回答として実験していたので、自分でそれを使用したいという強い欲求はありませんでした。
wBob 2014年

1
@wBob:絶対に必要な場合を除いて、サポートされていないDLLの追加には注意が必要です。System.Webリンクした「サポートされているライブラリ」リストにない正当な理由があります。それが機能することは保証されていません!。特に、US-ASCII以外の文字セットを処理する場合に、期待どおりに動作せず、Microsoftが修正しない状況に遭遇する可能性があります。私は知らない人のために明確にするために、私の回答にこれについての注記を追加します。
ソロモンルツキー2014年

@srutzky同意する。
wBob 2014年

1
あなたは命の恩人です。このライブラリをインポートできなかった場合、私はSOLになります。(これは非常にまれなケースの1つです。)
devinbost '12

5

この回答を確認してください。Uri.UnescapeDataStringまたはを使用する必要はありませんSystem.Web。関数とでWebUtility内部で呼び出されるクラスがあります。System.NetHtmlEncodeHtmlDecode


WebUtilitySQL Server 2012、2014以降を使用しているユーザーのみが利用できることを指摘する必要があります。SQL Server 2005、2008、および2008 R2をまだ使用しているユーザーは、.NET Framework 4.0で導入されたため、これを使用できません。
ソロモンルツキー

@srutzky 2014年の質問ですが、この制限についてユーザーに知らせることが重要です。.NET FrameworkのバージョンとSQL Serverのバージョンの関係を示すリンクを投稿できますか?
skeletank 2015

私の記事は本日公開されたので、SQL ServerのバージョンとSQLCLR機能(フレームワークバージョンとCLRバージョンを含む)の関係を示すグラフが存在します。SQLCLRレベル5への階段:開発(SQL Server内で.NETを使用)(無料の登録が必要です) )。
ソロモンRutzky
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.