23

SQL Serverデータベースプロジェクトを使用して、すべてのテーブル、ストアドプロシージャ、ビューなどのスクリプトを保持しようとしています。私は今、すべての参照(静的)データも保持できる方法が必要です。ツールまたはプロジェクトを実行すると、すべてのDBオブジェクトがインストールされ、すべての参照データが挿入されます。

2010年と同様の記事を見つけましたが、データベースの専門家向けのTeamEditionなどを使用していました。

  • DBをソース管理下に置きます。
  • ローカル開発DBをソース管理の最新バージョンと同期します。
  • VisualStudio2012およびSQLServer2012を使用する
  • Redgateのようなものではなく、可能な限り.Netツールを使用してください(Redgateは素晴らしいですが、VS 2012でツールを使用できるのであれば、まだそれを使いたくありません)
4

1 に答える 1

29

このアプローチを使用できます。

  • 参照データをテーブルごとに1つずつXMLファイルに入れます
  • 参照データを含むXMLファイルをデータベースプロジェクトに追加します
  • デプロイメント後のスクリプトを使用して、XMLからデータを抽出し、それをテーブルにマージします

これは、例とともに示されている、各ステップのより詳細な説明です。この構造を持つ国のテーブルを初期化する必要があるとしましょう。

create table Country (
    CountryId uniqueidentifier NOT NULL,
    CountryCode varchar(2) NOT NULL,
    CountryName varchar(254) NOT NULL
)

ReferenceDataデータベースプロジェクトの下にという新しいフォルダを作成します。との兄弟フォルダである必要がありSchema ObjectsますScripts

Country.xmlフォルダに呼び出される新しいXMLファイルを追加しReferenceDataます。次のようにファイルにデータを入力します。

<countries>
    <country CountryCode="CA" CountryName="Canada"/>
    <country CountryCode="MX" CountryName="Mexico"/>
    <country CountryCode="US" CountryName="United States of America"/>
</countries>

を見つけScript.PostDeployment.sqlて、それに次のコードを追加します。

DECLARE @h_Country int

DECLARE @xmlCountry xml = N'
:r ..\..\ReferenceData\Country.xml
'

EXEC sp_xml_preparedocument @h_Country OUTPUT, @xmlCountry

MERGE Country AS target USING (
    SELECT c.CountryCode, c.CountryName
    FROM OPENXML(@h_Country, '/countries/country', 1)
    WITH (CountryCode varchar(2), CountryName varchar(254)) as c) AS source (CountryCode, CountryName)
ON (source.CountryCode = target.CountryCode)
WHEN MATCHED THEN
    UPDATE SET CountryName = source.CountryName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (CountryId, CountryCode, CountryName) values (newid(), source.CountryCode, source.CountryName)
;

このソリューションはVS2008でのみ試しましたが、開発環境に依存しないはずです。

于 2012-12-21T17:22:02.980 に答える