SQL Serverの既存テーブルから、C#のPOCOモデルクラスを効率的に生成するための汎用T-SQLスクリプトを提供します。このスクリプトは、システムカタログビューを活用してカラム名、データ型、NULL許容性、および拡張プロパティ(コメント)を抽出し、整形されたC#コードを出力します。
以下のスクリプトを実行する前に、対象テーブル名を変数 @TargetTable に設定してください:
DECLARE @TargetTable NVARCHAR(128) = N'T1';
DECLARE @Output NVARCHAR(MAX) =
N'/// <summary>' + CHAR(13) + CHAR(10) +
N'/// ' + @TargetTable + N' (自動生成)' + CHAR(13) + CHAR(10) +
N'/// </summary>' + CHAR(13) + CHAR(10) +
N'public class ' + @TargetTable + N'{' + CHAR(13) + CHAR(10);
SELECT @Output +=
N' /// <summary>' + CHAR(13) + CHAR(10) +
N' /// ' + ISNULL(CAST(ep.value AS NVARCHAR(500)), N'未定義') + N' (DB: ' + c.name + N')' + CHAR(13) + CHAR(10) +
N' /// </summary>' + CHAR(13) + CHAR(10) +
N' public ' +
CASE t.name
WHEN N'bigint' THEN N'long'
WHEN N'binary' THEN N'byte[]'
WHEN N'bit' THEN N'bool'
WHEN N'char' THEN N'string'
WHEN N'date' THEN N'DateTime'
WHEN N'datetime' THEN N'DateTime'
WHEN N'datetime2' THEN N'DateTime'
WHEN N'datetimeoffset' THEN N'DateTimeOffset'
WHEN N'decimal' THEN N'decimal'
WHEN N'float' THEN N'double'
WHEN N'image' THEN N'byte[]'
WHEN N'int' THEN N'int'
WHEN N'money' THEN N'decimal'
WHEN N'nchar' THEN N'string'
WHEN N'ntext' THEN N'string'
WHEN N'numeric' THEN N'decimal'
WHEN N'nvarchar' THEN N'string'
WHEN N'real' THEN N'float'
WHEN N'smalldatetime' THEN N'DateTime'
WHEN N'smallint' THEN N'short'
WHEN N'smallmoney' THEN N'decimal'
WHEN N'text' THEN N'string'
WHEN N'time' THEN N'TimeSpan'
WHEN N'timestamp' THEN N'byte[]'
WHEN N'tinyint' THEN N'byte'
WHEN N'uniqueidentifier' THEN N'Guid'
WHEN N'varbinary' THEN N'byte[]'
WHEN N'varchar' THEN N'string'
ELSE N'object /* ' + t.name + N' */'
END +
CASE
WHEN c.is_nullable = 1
AND t.name IN (N'bigint', N'bit', N'date', N'datetime', N'datetime2', N'datetimeoffset',
N'decimal', N'float', N'int', N'money', N'numeric', N'real',
N'smalldatetime', N'smallint', N'smallmoney', N'time', N'tinyint', N'uniqueidentifier')
THEN N'?'
ELSE N''
END +
N' ' + REPLACE(c.name, N' ', N'_') + N' { get; set; }' + CHAR(13) + CHAR(10)
FROM sys.columns c
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
LEFT JOIN sys.extended_properties ep
ON ep.major_id = c.object_id AND ep.minor_id = c.column_id AND ep.name = N'MS_Description'
WHERE c.object_id = OBJECT_ID(@TargetTable)
ORDER BY c.column_id;
SET @Output += N'}';
PRINT @Output;
上記スクリプトの特徴:
- 各プロパティにXMLドキュメントコメントを含め、データベースカラム名と拡張プロパティ(
MS_Description)を両方表示 - スペースを含むカラム名は自動でアンダースコアに置換
- nullable参照型(
string,byte[]など)には?修飾子を適用せず、値型のみに適用(例:int?,DateTime?) - 不明なSQL Server型に対してはコメント付きの
object型をフォールバックとして使用 - 出力は単一の
PRINTステートメントで生成されるため、SSMSで直接実行・コピー可能
さらに簡易なカラム定義リスト(プロパティ行のみ)が必要な場合は、以下のようにクエリを調整できます:
DECLARE @TargetTable NVARCHAR(128) = N'AUTHSYSTEMCHANGE';
SELECT
CONCAT(
'public ',
CASE t.name
WHEN N'int' THEN N'int'
WHEN N'varchar' THEN N'string'
WHEN N'nvarchar' THEN N'string'
WHEN N'datetime' THEN N'DateTime'
WHEN N'float' THEN N'double'
ELSE N'object'
END,
CASE WHEN c.is_nullable = 1 AND t.name IN (N'int', N'datetime', N'float') THEN N'?' ELSE N'' END,
N' ',
REPLACE(c.name, N' ', N'_'),
N' { get; set; }'
) AS PropertyCode
FROM sys.columns c
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID(@TargetTable)
ORDER BY c.column_id;