1

SSDTデータベースプロジェクトには、顧客の要件に応じて、いくつかの形式のいずれかをとることができる計算列を持つテーブルが含まれています。この計算列を管理して、全員の列をデフォルトに戻さなくても発行機能を使用できるようにする方法を見つけようとしています。

私が達成しようとしていることは、次の無効なT-SQLコードで説明できます。

CREATE TABLE dbo.Customer
(
  Id INTEGER,
  Region INTEGER,
  Name VARCHAR(50),
  AccountNumber AS dbo.FormatAccountNumber(Id, Region)
)

CREATE FUNCTION [dbo].[FormatAccountNumber]
(
  @Id INTEGER,
  @Region INTEGER
)
RETURNS VARCHAR(20)
AS
BEGIN
  IF '$(AccountType)' = 'Regional'
    RETURN CONVERT(VARCHAR, @Region) + '-' + CONVERT(VARCHAR, @Id)

  IF '$(AccountType)' = 'Merged'
    RETURN CONVERT(VARCHAR, @Region * 100000 + @Id)

  IF '$(AccountType)' = 'Flat'
    RETURN CONVERT(VARCHAR, @Id)
END

もちろん、これは、$(AccountType)SQLCMD変数を関数内で使用できず、実行時に適切に設定されないため、機能しません。また、関数全体にSQLCMDを条件付きで配置しようとしました。

IF '$(AccountType)' = 'Flat'
  CREATE FUNCTION ...

ただし、これにより、「CREATEFUNCTIONはバッチ内の唯一のステートメントである必要があります」というエラーが発生します。

SSDTプロジェクトでスキーマの条件付きコンパイルを行う方法はありますか?そうでない場合は、SSDT公開プロセス内でこの種のカスタマイズ可能なフィールドを維持するためにどのようなオプションがありますか?

4

2 に答える 2

2

Post-Deplomentスクリプトを使用して、動的SQLでオブジェクトを強制的にデプロイできます。

IF NOT EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID(N'[dbo].[FormatAccountNumber]') 
            AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
EXEC('CREATE FUNCTION [dbo].[FormatAccountNumber] () RETURNS BIT AS BEGIN RETURN 0 END')
GO 

IF '$(AccountType)' = 'Regional'
BEGIN
    EXEC('
        ALTER FUNCTION [dbo].[FormatAccountNumber]
        (
          @Id INTEGER,
          @Region INTEGER
        )
        RETURNS VARCHAR(20)
        AS
        BEGIN
            RETURN CONVERT(VARCHAR, @Region) + ''-'' + CONVERT(VARCHAR, @Id)
        END
    ')
END

dbo.FormatAccountNumberこれを行うと、SSDTデータベースプロジェクトの関数を参照できなくなることに注意してください(これらのオブジェクトが展開後のスクリプトにも含まれている場合を除く)。

.sqlprojまた、ファイル自体(要素内)内に条件を追加することを含む代替ソリューションを試しましたItemGroupが、MsBuildプロパティはSQLCMD変数とまったく同じではないため、これは少し厄介になりましたが、これを投稿することができますあなたが好きです。

データベースにオブジェクトを条件付きで頻繁にデプロイする必要がある場合は、(SSDTプロジェクトの宣言型スタイルではなく)命令ベースのデプロイメントソリューションへの移行を検討することをお勧めします。移行と呼ばれることが多い命令型デプロイメントにより、デプロイ時の動作をより細かく制御できます。

免責事項:私はReadyRollの創設者です。ReadyRollは、命令型デプロイメントを使用するVS用の製品を作成しています。

于 2012-09-26T03:07:13.047 に答える
0

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

于 2013-07-27T02:25:52.427 に答える