MSSMSで生成されたアセンブリスクリプトのように、ストリームからアセンブリを作成できますか?SQLServerがアクセスできないディレクトリに配置されたDLLからアセンブリを作成する必要があります。
ただし、アセンブリインストーラはアセンブリにアクセスできます。
だから私の質問は:アセンブリを読み取り、読み取ったストリームから作成を生成できますか?
ありがとう。
MSSMSで生成されたアセンブリスクリプトのように、ストリームからアセンブリを作成できますか?SQLServerがアクセスできないディレクトリに配置されたDLLからアセンブリを作成する必要があります。
ただし、アセンブリインストーラはアセンブリにアクセスできます。
だから私の質問は:アセンブリを読み取り、読み取ったストリームから作成を生成できますか?
ありがとう。
私はそれを理解したと思います..私はこの投稿
からTomalakのByteArraytoHexadecimalメソッドを使用しています。
private string getAssemblyAsHex(string asmPath)
{
using (BinaryReader br = new BinaryReader(File.OpenRead(asmPath)))
{
byte[] buff = new byte[br.BaseStream.Length];
br.Read(buff, 0, buff.Length - 1);
return ByteArrayToString(buff);
}
}
private static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
次に、この文字列をCREATEASSEMBLYステートメントに連結します。Visual Studio 2013が、SQL CLRプロジェクトをビルドするときに、CREATEASSEMBLY呼び出しで使用されるビット文字列を使用してSQLスクリプトを自動的に生成することを発見したのは嬉しい驚きでした。
プロジェクトをビルドし、binフォルダーでDacUnpack.exeを使用して「*.dacpac」ファイルを解凍します。解凍されたフォルダで「model.sql」を探します。これには、次のようなCREATEASSEMBLY呼び出しが含まれています。
CREATE ASSEMBLY [MyFunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A90000[very long string here...];
CREATE ASSEMBLY
SQLCLR(SQL Server 2005で導入された)をサポートするVisual Studio / SSDTの初期バージョン(Visual Studio 2005以降)は、発行/展開スクリプトのコマンドでDLLとそれへのファイルシステム参照に依存していました。ただし、Visual Studio 2012では、このアプローチはVARBINARYリテラル(つまり、ドキュメントで参照されている16進バイト文字列)をスクリプト化することで置き換えられました。したがって、生成された展開スクリプトを使用している場合、それ以降Visual Studio / SSDTを使用している人は、必ずしもこの手順を手動で実行する必要はありません。SSDTで生成されたデプロイメントスクリプトを使用していない場合、DLLをこのVARBINARYリテラルに変換するための最良のアプローチは、私が作成したオープンソースユーティリティです。
コード(およびプリコンパイルされたEXE)は、GitHubのBinaryFormatterにあります。
SQL Server 2017以降でのSQLCLRの操作については、次のブログ投稿を参照してください。
一般的なSQLCLRの操作の詳細については、SQLCLR情報を参照してください。