思い立ってから、完成するまでに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の最新記事】
- PowerShell のバージョンを確認して、最新の PowerShell(pwsh)を実行する方法
- PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv )
- PowerShell : COM 経由(New-Object) + MySQL Connector/ODBC でループ処理をしながら更新
- PowerShell でエクスプローラでコピーしたファイルリストを取得して、テキストのクリップボードに再度コピーしなおす
- PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法
- PowerShell2.0 : PowerShell のコードだけで TKMP.dll を使用してメールを送信する
- PowerShell2.0 : PowerShell 内で VBのコードを記述(TKMP.dllを使用)して、exe を作成した後実行してメールを送信する
- PowerShell で PNG 画像にフォントを指定してテキストを書き込む
- PowerShell より New-Object で .NET Framework を使って簡単にバイナリファイルをアップロードする
- PowerShell より COM オブジェクトを使用して、簡単にバイナリファイルをアップロードする
- PowerShell2.0 : here-string と呼ばれるヒアドキュメント( here-string )の構文
- PowerShell2.0 : 初めての PowerShell / ファイルのダウンロード (.NET Framework の利用)
- PowerShell2.0 : ファイルを開くダイアログを使う
- PowerShell2.0 : イベントの処理とタイマーと、関数と変数のスコープ
- PowerShell(スクリプト)の引数を格納する配列変数 $args の扱い
- PowerShell2.0 : Shell.Application でディレクトリ内のファイルとディレクトリの個数( .NET の文字列フォーマット )
- PowerShell2.0 : PowerShell ISE で Excel のオブジェクトを利用して完全に終了(メモリから解放)させるには
- PowerShell2.0 : 全ての日本語ヘルプファイル(テキスト)を作成するスクリプト
- PowerShell2.0 : プロンプトの変更
- PowerShell2.0 : .NET Framework のスタティックメソッドの実行