web-dev-qa-db-ja.com

SQLでアセンブリを作成できませんでした

私はすでにSQLclrプログラミングに飛び込んできました。残念ながら、私の最初の試みは問題を抱えています。私のC#アセンブリコードはまさにそうです:

enter code here
public partial class FirstCLRRoutines
{
    public static int GetCLRFrameworkMajorVersion()
    {
        return System.Environment.Version.Major;
    }
}

そしてSQLコードは次のとおりです。

USE master
GO
CREATE Assembly [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'

しかし、MSSMSEから次のエラーメッセージが表示されます。

メッセージ6218、レベル16、状態3、行1
アセンブリ 'SQL_CLR'が検証に失敗したため、アセンブリ 'SQL_CLR'のアセンブリを作成できませんでした。参照されているアセンブリが最新であり、データベースで実行することが信頼されている(external_accessまたは安全でない)かどうかを確認します。このメッセージの後にCLRベリファイアのエラーメッセージが続く場合

22
Mesut

まったく同じ問題が発生しました。

これは古いページですが、最初に、何よりも最後に、DLL 必須は.NET2.0でビルドされます。SqlServer2005は.net2.0でビルドされます。は、作成時に利用可能な最新のものです。SqlServer2008でも同じ問題が発生する可能性があります。

DLLとSqlServerは両方とも同じ.NETフレームワークバージョンを参照する必要があります。これを理解したら、2.0で別のプロジェクトを作成し、shazam!は初めて完璧に機能しました。

SQLサーバーが使用している.netのバージョンを確認するには:

select * from sys.dm_clr_properties
38
horace

受け入れられた答えは、O.P。の問題を解決しているように見えますが、部分的に正しいだけであり、根本的な原因の過度に単純化された説明を提示しているため、他の人々が同様の問題を間違った方向に導く可能性があります。

受け入れられた回答の問題は、.NET環境の誤解であり、同じ誤解が質問自体にも見られます。 .NET内では、CLRとフレームワークは2つの別個のものであり、それぞれに独自のバージョンがあります。

CLR(共通言語ランタイム)は、マネージコードを実行するものです。これは、フレームワークほど頻繁には更新されません。 .NET Frameworkは、CLRの特定のバージョンと対話するための基本的な手段を提供するライブラリのコレクションです。

CLRの単一バージョンには、通常、動作するフレームワークの複数のバージョンがあります。ただし、フレームワークの単一バージョンは、CLRの特定のバージョンでのみ機能します。たとえば、CLRバージョン2.0はFrameworkバージョン2.0、3.0、および3.5で動作しますが、CLRバージョン4.0はすべての4.xバージョンの.NET Framework(4.0、4.5、4.5.1、4.5.2、4.6)で動作します。など)。 CLRバージョンとフレームワークのバージョンの関係のグラフを表示するには、MSDNページの 。NET Frameworkのバージョンと依存関係 を参照してください。

SQLCLRコードに関しては、SQL Serverは単一バージョンのCLRでのみ機能し、特定のバージョンはSQLServerのバージョンによって異なります。 SQL Server 2005、2008、および2008 R2はCLRバージョン2でのみ機能します。CLRバージョン2は.NETFrameworkバージョン2.0、3.0、および3.5でのみ機能するため、SQL Server 2005、2008、および2008R2はでのみ機能します。 NET Frameworkバージョン2.0、3.0、および3.5。もちろん、SQL Server2005には.NETFrameworkバージョン2.0しか含まれていなかったため、.NET Frameworkバージョン3.0および3.5には、手動でインポートしないとSQL Server 2005では機能しない新しいライブラリがいくつかあります(つまりSystem.CoreおよびSystem.Xml.Linq)。これらの同じ方針に沿って、SQL Server 2012、2014、および2016は、.NET Frameworkバージョン4.0、4.5、4.5.1、4.5.2、4.6で動作するCLRバージョン4に静的にリンクされています。

両方から返される情報に関してSystem.Environment.Version(質問内)およびsys.dm_clr_properties.version(受け入れられた回答で)、彼らは[〜#〜] clr [〜#〜]バージョンを報告していますnotFrameworkバージョン。したがって、2.0または4.0を報告するこれら2つのことを、Frameworkバージョン2.0または4.0しか使用できないことを意味するものと混同しないように注意してください。

また、下位互換性があるため、CLR 2フレームワークバージョン(2.0、3.0、および3.5)に対してコンパイルされたコードは、CLRバージョン4であっても、SQL Server2012以降で再コンパイルする必要なしに実行されます。

したがって、通常、2.0のターゲットフレームワークバージョンを使用しても問題はありませんが、2.0以降のフレームワークバージョンを使用できることは間違いありません。

SQLCLRコードの開発の詳細については、私が書いた次の記事(および一般的なシリーズ)を確認してください。

SQLCLRレベル5への階段:開発(SQL Server内で.NETを使用)

8
Solomon Rutzky
USE master 
GO 
CREATE Assembly [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 
WITH PERMISSION_SET = UNSAFE

それを試して、それがうまくいくかどうか私に知らせてください。

4
user596075

ライブラリSystem.Environmentは、CLRではサポートされていません: http://msdn.Microsoft.com/en-us/library/ms403279.aspx

上記の記事の「サポートされていないライブラリ」セクションに示されているように、引き続き使用できますが、コードのセキュリティと信頼性はテストされていないことに注意してください。これにより、実稼働環境で予測できない結果が生じる可能性があるため、リスクを考慮し、展開する前に慎重にテストしてください。

また、実行する前に、厳密な名前を付けるか、「信頼できる」とマークされたデータベースにデプロイする必要があると思います。

0
brian

簡単な答え:プロジェクトプロパティにSQLServerバージョンと.NetFrameworkバージョンを設定します。

まず、プロジェクトプロパティの設定を確認する必要があります。プロジェクトプロパティで、CLRを作成するSQLサーバーのバージョンを設定します。次に、.NetFrameworkバージョンを選択します。たとえば、SQL Server 2008のCLRを作成する場合は、.Net Frameworkを3.5に設定する必要があり、2005の場合は.Net2.0を選択します。このソリューションがお役に立てば幸いです。

0
mehdi