SQL Serverストアドプロシージャの条件付きコンパイル


8

ショートバージョン: Visual Studio 2010のSQL Serverデータツールを使用して、SQL ServerデータプロジェクトのTSQLコードのチャンクを条件付きでコンパイルする方法はありますか?

Visual Studio 2010でSQL Serverデータツールを使用して、実験的なSQL Server Expressデータベースで作業しています。物事がうまく機能する場合の最終的な宛先は、エンタープライズSQL Serverプラットフォームです。私の会社は多くのエンタープライズデータベースについても2008から2012への移行を進めているため、あるボックスに2008インスタンスと別のボックスに2012インスタンスの両方を持っています。

私が使用した他のプログラミング言語では、プリプロセッサディレクティブを使用すると、コードベースの一部を条件付きで簡単にコンパイルできます。これの最も一般的な用途は、制限されたセクションに異なるプラットフォームの異なるコードを含めること、またはリリースビルドからデバッグ出力コード除外することです。

これらの両方は、私が取り組んでいるいくつかのストアプロシージャで非常に役立ちます。このようなものはありますか?sqlcmd展開中に変数を使用して特定の値を交換できることはわかっていますが、それを使用して後続のコードのチャンクを含めたり除外したりする方法を理解できません。

例:

#IF $(DebugVersion) = 'True'
    -- A bunch of useful PRINTs and what not
#ELSE
    SET NOCOUNT ON
#ENDIF

#IF $(SSVersion) = '2012'
    SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy')
#ELSE
    SET @pretty_date = CAST(@some_date AS nvarchar(12))
#ENDIF

回答:


6

SSDTでこれが可能であることは残念ながら知りません。

プロジェクトの大きさや、2012年の特典で強化する予定の手順の数によっては、コンポジットプロジェクトで管理できる場合があります。

SSDTは、データベースプロジェクトを1つ以上の参照データベースプロジェクトまたはdacpacsと組み合わせて、単一の複合データベーススキーマを記述できます。複合プロジェクトを使用すると、大規模なデータベースをより管理しやすいチャンクに分割でき、さまざまな人またはチームがスキーマ全体のさまざまな部分を担当できるようになり、複数のデータベースでデータベースオブジェクト定義を再利用できます。

概念は、共通のオブジェクト定義と、新機能を使用した手順のバージョン固有のプロジェクトを含む基本プロジェクトを持つことです。2012プロジェクトはベースプロジェクトを参照し、コンパイル/ビルドは両方のオブジェクトを結合します。

PITAでは、ベースプロジェクトのオブジェクトをコンポジットのオブジェクトでオーバーライドできないため、ベースプロジェクト、2008&2012プロジェクトを維持する必要があります。特定のプロシージャの2012バージョンが必要な場合は、ベースから削除し、2008と2012の両方のプロジェクトでバージョンを作成する必要があります。


2

この必要性について、MSDNで公開討論をしました。あまり進歩していません。理想的な状況では、ベースssdtプロジェクトでdbオブジェクトに「継承可能」フラグを付けて、ベースプロジェクトまたはDACを参照する他のプロジェクトが重複オブジェクトについて文句を言わないようにし、以下の場合にのみベースオブジェクトまたは「スタブ」を作成します。それは存在しませんでした。これにより、データベースモデルの「レイヤー」を持つことができます。オーバーライドされたストアドプロシージャによるSSDT複合ソリューションの msdn 拡張に関する私の投稿を参照してください


2

事前構築イベントを使用することで、求められていることに近いものを達成しました。私の場合、構築されている構成に応じて、さまざまなユーザーとログインをデプロイメントに含めたいと思いました。

これを行うために、ユーザーごとに、ビルド構成ごとに.sqlファイルを作成しました。私はこれらにビルドアクション「なし」のフラグを立てました(これらをプロジェクトのサブフォルダーに配置しました)。

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

次に、空のファイルSomeUser.sqlを作成しました(ビルドアクション= 'Build'を使用)。

ビルド前のイベントコマンドラインで:

Copy $(ProjectDir)subfolder\$(Configuration)_Someuser.sql $(ProjectDir)Someuser.sql

コーダーのチームが常にgitで競合を引き起こしているのは厄介だったので、ビルド前のコマンドラインにも追加しました

git update-index --assume-unchanged $(ProjectDir)Someuser.sql 

考慮すべきユーザーと構成の数がはるかに多いため、これを機能させるのはかなり手間がかかりましたが、機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.