6

VS2010を使用してCLRストアドプロシージャに取り組んでいます。この手順を顧客のサーバーにインストールするには、スタンドアロンの展開スクリプトを生成する必要があります。現在、F5キーを押してDBサーバーでSPをデバッグしようとすると、このようなスクリプトを生成するVisualStudioを使用しています。このスクリプトはbin\Debug\MyStoredProcedure.sqlファイルに配置されます。次のようになります。

USE [$(DatabaseName)]

GO
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors
GO
CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
GO
PRINT N'Dropping [dbo].[spMyStoredProcedure]...';


GO
DROP PROCEDURE [dbo].[spMyStoredProcedure];


GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO
PRINT N'Dropping [MyStoredProcedure]...';


GO
DROP ASSEMBLY [MyStoredProcedure];


GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO
PRINT N'Creating [MyStoredProcedure]...';


GO
CREATE ASSEMBLY [MyStoredProcedure]
    AUTHORIZATION [dbo]
-- here should be long hex string with assembly binary
    FROM 0x4D5A90000300000004000000FFFCD21546869732070726F6772616D...000000000000000000 
    WITH PERMISSION_SET = SAFE;


GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO
PRINT N'Creating [dbo].[spMyStoredProcedure]...';


GO
CREATE PROCEDURE [dbo].[spMyStoredProcedure]
@reference UNIQUEIDENTIFIER, @results INT OUTPUT, @errormessage NVARCHAR (4000) OUTPUT
AS EXTERNAL NAME [MyStoredProcedure].[MyCompany.MyProduct.MyStoredProcedureClass].[MyStoredProcedureMethod]


GO
IF @@ERROR <> 0
   AND @@TRANCOUNT > 0
    BEGIN
        ROLLBACK;
    END

IF @@TRANCOUNT = 0
    BEGIN
        INSERT  INTO #tmpErrors (Error)
        VALUES                 (1);
        BEGIN TRANSACTION;
    END


GO
IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'The transacted portion of the database update succeeded.'
COMMIT TRANSACTION
END
ELSE PRINT N'The transacted portion of the database update failed.'
GO
DROP TABLE #tmpErrors
GO

Visual Studioなしでそのようなスクリプトを生成することは可能ですか?たとえば、MSBuildを使用してソリューションをビルドし、ツールを使用してこのスクリプトを生成するとどうなりますか?アセンブリをバイト配列として読み取り、それを16進文字列にシリアル化してスクリプトテンプレートに挿入すると、機能する可能性があると思いますが、もっと簡単な標準ソリューションがあるのではないでしょうか。

ありがとう。

4

5 に答える 5

5

または、アセンブリをVisualStudioからテストSQLサーバーに直接展開していると仮定します。SSMS(管理スタジオ)でアセンブリを右クリックしてスタンドアロンの展開スクリプトを作成し、次を選択します。

スクリプトアセンブリとして->作成先...

これにより、DLLを表す16進文字列が、単一ファイルの展開に使用できるSQLスクリプトに書き込まれます。

于 2012-04-23T20:16:07.853 に答える
4

さて、唯一の方法は、アセンブリをバイナリファイルとして読み取り、上記のテンプレートを使用してスクリプトを生成することだと思われます。そんな感じ:

            using (var str = File.OpenRead(pathToAssembly))
            {
                int count = 0;
                do
                {
                    var buffer = new byte[1024];
                    count = str.Read(buffer, 0, 1024);

                    for (int i = 0; i < count; i++)
                    {
                        hexStringBuilder.Append((buffer[i] >> 4).ToString("X"));
                        hexStringBuilder.Append((buffer[i] & 0xF).ToString("X"));
                    }
                } while (count > 0);
            }
            // generate script using template from initial question

このアプローチを確認しましたが、機能します。

于 2011-01-19T20:27:53.037 に答える
1

説明した内容は正常に機能するはずですが、CLRデータベースオブジェクトのデプロイで説明されているように、コンパイルされたDLLを参照する方が簡単なようです。

Transact-SQLを使用してアセンブリをデプロイするには

.NET Frameworkに含まれているコマンドラインコンパイラを使用して、ソースファイルからアセンブリをコンパイルします。

Microsoft Visual C#ソースファイルの場合:

csc / target:library C:\ helloworld.cs

Microsoft Visual Basicソースファイルの場合:

vbc / target:library C:\ helloworld.vb

これらのコマンドは、/targetオプションを使用してVisualC#またはVisual Basicコンパイラを起動し、ライブラリDLLの構築を指定します。

アセンブリをテストサーバーに展開する前に、すべてのビルドエラーと警告を解決してください。

テストサーバーでSQLServerManagementStudioを開きます。適切なテストデータベース(AdventureWorks2008R2など)に接続された新しいクエリを作成します。

次のTransact-SQLをクエリに追加して、サーバーにアセンブリを作成します。

'c:\helloworld.dll'からPERMISSION_SET=SAFEを使用してアセンブリHelloWorldを作成します

次に、SQL Serverのインスタンスで、プロシージャ、関数、集計、ユーザー定義型、またはトリガーを作成する必要があります。HelloWorldアセンブリのProceduresクラスにHelloWorldという名前のメソッドが含まれている場合、次のTransact-SQLをクエリに追加して、SQLServerでhelloという名前のプロシージャを作成できます。

プロシージャの作成こんにちは

なので

外部名HelloWorld.Procedures.HelloWorld

于 2011-01-19T17:32:20.487 に答える
1

この投稿を読んで、 / Action:Publishを使用する代わりに/ Action:Script / OutputPath:D:\deploymentScript.sqlを使用してください

于 2016-12-21T18:36:03.497 に答える
0

アセンブリバイナリはsys.assembly_filesから取得できます。おそらくあなたはそれで何かをすることができます。

select *
from sys.assembly_files
于 2011-01-19T18:27:25.607 に答える