2011-01-19 6 views
5

私はVS2010を使用してCLRストアドプロシージャを作成しています。この手順をカスタマーサーバーにインストールするには、スタンドアロン展開スクリプトを生成する必要があります。今私はF5キーを押してDBサーバー上のSPをデバッグしようとすると、そのようなスクリプトを生成するVisual Studioを使用しています。このスクリプトはbin\Debug\MyStoredProcedure.sqlファイルに置かれています。Visual Studioを使用しないでSQL CLRストアドプロシージャのインストールスクリプトを生成する方法

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進数の文字列にシリアル化してスクリプトテンプレートに挿入すると、それはうまくいくかもしれないと信じています。

ありがとうございました。

答えて

3

唯一の方法は、バイナリファイルとしてアセンブリを読み取り、上記のテンプレートを使用してスクリプトを生成することです。次のようなものがあります:

  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 

私はこのアプローチをチェックしています。

+0

これは' FROM 'C:\ FilePath''よりもずっと高速ですが、また、 'FROM 0xhexWithoutQuotes'のように' 0x'を前置しなければなりませんでした。 –

1

説明した内容はうまくいくはずですが、Deploying CLR Database Objectsはコンパイル済みのDLLを参照する方が簡単だと説明しています。

のTransact-SQLを

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

CSC /対象:図書館C:Microsoft Visual Basicのソースについては、\ helloworld.cs

ファイル:

VBC /対象:図書館C:のMicrosoft Visual C#ソースファイルの場合

\ helloworld.vb

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

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

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

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

からASSEMBLY HelloWorldの作成]のC:\ helloworld.dll 'WITH PERMISSION_SET = SAFE

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

はハロー

EXTERNAL NAME HelloWorld.Procedures.HelloWorld AS

+0

が、その適用されません - 私たちの顧客が欲しいです単一ファイル展開スクリプトを使用する –

+0

@Victor ah。 "私はバイト配列としてアセンブリを読み込んだ後、それを16進文字列にシリアル化してスクリプトテンプレートに挿入する - –

0

あなたはsys.assembly_filesから組み立てバイナリを取得することができますプロシージャを作成します。おそらくあなたはそれで何かをすることができます。

select * 
from sys.assembly_files 
3

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

スクリプトアセンブリを - >するために作成...

このDLLを表す16進文字列を書き込みますSQLスクリプトでは、1つのファイル配備に使用できます。

0

読むthisポスト、代わりに使用の/処置:使用/アクション公開:スクリプト/OutputPath:D:\deploymentScript.sql私は、このソリューションについて知っ

関連する問題