SQLの窓

2014年10月07日


PowerShell で、SQLServer2012 の SMO を使用してテーブルの create 用のスクリプトを出力する

思い立ってから、完成するまでに1日かかりました。すこしづづ情報を集めてやっとという感じです。最初に C# で動作確認し、その後 PowerShell に移植しました。

びっくりしたのは、サーバーにパスワード等で接続しなくても、ローカルの SQLExpress を参照可能だったというところです。

Add-Type の参照部分では、SQLServer のバージョンによってファイルが変わる可能性があり、それに関するトラブルを多く見かけました。最初、単純に Table オブジェクトからスクリプトを作成しようとしたのですが、どうしてもうまく行かず、Scripter を使うコードにぶちあたって、いとも簡単に出力できました。

ただ、その際に Framework のオブジェクトの配列が必要だったので、そこでも少し調査に時間がかかりました。

で、結局出力されたのは以下のような UTF-8N のテキストファイルです。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[社員マスタ](
	[社員コード] [varchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[氏名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[フリガナ] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[所属] [varchar](4) COLLATE Japanese_CI_AS NULL,
	[性別] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[給与] [int] NULL,
	[手当] [int] NULL,
	[管理者] [varchar](4) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

▼ PowerShell のコード
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll"
$srv = New-Object Microsoft.SqlServer.Management.Smo.Server

$db = $srv.Databases["lightbox"]
$scrp = New-Object Microsoft.SqlServer.Management.Smo.Scripter($srv)
$scrp.Options.ScriptDrops = $false
$scrp.Options.WithDependencies = $true
$smoObjects = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] -ArgumentList 1
$smoObjects[0] = $db.Tables["社員マスタ"].Urn
$sc = $scrp.Script($smoObjects)

$srv.ConnectionContext.Disconnect()

$ftext = New-Object System.IO.StreamWriter -ArgumentList "C:\user\script.txt"

foreach($text in $sc){
  $ftext.WriteLine( $text )
}

$ftext.Close()


C# で同等の処理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;
using Microsoft.SqlServer.Management.Sdk.Sfc;

namespace smo_table_script
{
	class Program
	{
		static void Main(string[] args)
		{
			Server srv = new Server();

			Database db = srv.Databases["lightbox"];
			Scripter scrp = new Scripter(srv);
			scrp.Options.ScriptDrops = false;
			scrp.Options.WithDependencies = true;

			Urn[] smoObjects = new Urn[1];
			smoObjects[0] = db.Tables["社員マスタ"].Urn;

			StringCollection sc = scrp.Script(smoObjects);
			foreach (string st in sc)
			{
				Console.WriteLine(st);
			}

			Console.ReadLine();
		}
	}
}




【PowerShellの最新記事】
posted by lightbox at 2014-10-07 22:00 | PowerShell | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり