創屋ぷれす

C#.NETからSQL Serverの定義スクリプトを取得(SMO)

プログラム内からSQLServerのスキーマ定義を取得する方法がないか調べていると、SMO、SQL-DOMというのがあるらしい。
SQL Server 管理オブジェクト (SMO)
試しにVB.NETのサンプルコードをC#に書き換えて試してみると、確かにテーブル作成クエリが取得できる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Sdk.Sfc;
using System.Collections.Specialized;

namespace SMOTests
{
class SMOTest
{
public void CreateScript()
{
Server srv = new Server();
Database db = srv.Databases["データベース名"];
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;

foreach (Table tb in db.Tables)
{
Urn[] smoObjects = new Urn[1];
smoObjects[0] = tb.Urn;
if (!tb.IsSystemObject)
{
StringCollection sc = scrp.Script(smoObjects);
foreach (string st in sc)
{
Console.WriteLine(st);
}
}
}
}
}
}

ちなみに、Microsoft.SqlServer.SmoEnum.dllがなくて悩んだけど、以下を参考にMicrosoft.SqlServer.Management.Sdk.Sfc.dllを代わりに参照に追加で解決(ただ配布環境にないこともありそうなので要考慮)
SQL Server 2005 版の SMO を使用しているアプリケーションで SQL Server 2008 版の SMO の新しい機能を使用する方法

Comments are closed.