SQLの窓

2018年10月19日


C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する

SMO のダウンロード方法は、C# : VB.net : SQLExpress(SQLServer) : SQL-DMO と同等の SMO によるバックアップ を参照して下さい。

こちらは、同じコードを PowerShell で実行します

参考ページ : Generate Scripts for database objects with SMO for SQL Server
※ 参考ページでは、いろいろなオプションが紹介されています。

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQLExpress_backup
{
	class Program
	{
		static void Main(string[] args)
		{

			{

				UTF8Encoding UTF8N_Enc = new UTF8Encoding();
				// false は上書き
				StreamWriter WriteFile = new StreamWriter("sqlexpress.sql", false, UTF8N_Enc);

				// サーバー
				Server srv;
				// インスタンス
				srv = new Server();

				// サーバーインスタンスの情報
				srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
				srv.ConnectionContext.LoginSecure = false;
				srv.ConnectionContext.Login = "sa";
				srv.ConnectionContext.Password = "";
				// 接続
				srv.ConnectionContext.Connect();

				// バージョンの表示
				Console.WriteLine(srv.Information.Version);

				// 参考
				// https://www.mssqltips.com/sqlservertip/1833/generate-scripts-for-database-objects-with-smo-for-sql-server/
				// Scripter scripter = new Scripter(srv);

				Database myDb = srv.Databases["lightbox"];
				foreach (Table myTable in myDb.Tables)
				{

					StringCollection tableScripts = myTable.Script();
					foreach (string script in tableScripts)
					{
						WriteFile.WriteLine(script);
					}
				}

				WriteFile.Close();
				WriteFile.Dispose();

				srv.ConnectionContext.Disconnect();

			}


		}
	}
}


結果サンプル

※ sqlexpress.sql に出力された内容です
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[コード名称マスタ](
	[区分] [int] NOT NULL,
	[コード] [nvarchar](10) COLLATE Japanese_CI_AS NOT NULL,
	[名称] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[数値1] [int] NULL,
	[数値2] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[社員マスタ](
	[社員コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[氏名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[フリガナ] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[所属] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[性別] [int] NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[給与] [int] NULL,
	[手当] [int] NULL,
	[管理者] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[生年月日] [datetime] NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[取引データ](
	[取引区分] [nvarchar](2) COLLATE Japanese_CI_AS NOT NULL,
	[伝票番号] [int] NOT NULL,
	[行] [int] NOT NULL,
	[取引日付] [datetime] NULL,
	[取引先コード] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[商品コード] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[数量] [int] NULL,
	[単価] [int] NULL,
	[金額] [int] NULL,
	[更新済] [nvarchar](1) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[商品マスタ](
	[商品コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[商品名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[在庫評価単価] [int] NULL,
	[販売単価] [int] NULL,
	[商品分類] [nvarchar](3) COLLATE Japanese_CI_AS NULL,
	[商品区分] [nvarchar](1) COLLATE Japanese_CI_AS NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[備考] [ntext] COLLATE Japanese_CI_AS NULL,
	[削除フラグ] [nvarchar](1) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[得意先マスタ](
	[得意先コード] [nvarchar](4) COLLATE Japanese_CI_AS NOT NULL,
	[得意先名] [nvarchar](50) COLLATE Japanese_CI_AS NULL,
	[得意先区分] [nvarchar](1) COLLATE Japanese_CI_AS NULL,
	[担当者] [nvarchar](4) COLLATE Japanese_CI_AS NULL,
	[郵便番号] [nvarchar](7) COLLATE Japanese_CI_AS NULL,
	[住所1] [nvarchar](100) COLLATE Japanese_CI_AS NULL,
	[住所2] [nvarchar](100) COLLATE Japanese_CI_AS NULL,
	[作成日] [datetime] NULL,
	[更新日] [datetime] NULL,
	[締日] [int] NULL,
	[締日区分] [int] NULL,
	[支払日] [int] NULL,
	[備考] [nvarchar](100) COLLATE Japanese_CI_AS NULL
) ON [PRIMARY]

SET ANSI_NULLS (Transact-SQL)
SET ANSI_NULLS が ON の場合、WHERE column_name = NULL を使用する SELECT ステートメントを実行すると、column_name に NULL 値が入っていた場合は条件は成り立たず、行が返されません。逆に、SET ANSI_NULLS が OFF の場合は、ISO 標準が適用されません。 WHERE column_name = NULL を使用する SELECT ステートメントでは、column_name に NULL 値を持つ行が返されます。

SET ANSI_NULLS OFF;
select * from [社員マスタ] where 手当 = null;

この SQL では、手当が NULL の行が戻されます


SET QUOTED_IDENTIFIER ON にすると、テーブル名等の識別市子を "(ダブルクォート)で囲む事ができます

SET QUOTED_IDENTIFIER OFF; 
select * from "社員マスタ"

この SQL はエラーとなります
【VS(C#)の最新記事】
posted by lightbox at 2018-10-19 14:10 | VS(C#) | このブログの読者になる | 更新情報をチェックする
container 終わり

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

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり