using System.Text;
namespace HotelPms.Share.Data.Script;
public class TableCreator : IDisposable
{
public TableCreator()
{
}
///
/// 初期化
/// 必ずPKがある
///
/// テーブル名
public TableCreator(string name)
{
Name = name;
}
///
/// テーブル名
///
public string Name { get; set; } = string.Empty;
///
/// テーブルの説明
///
public string Description { get; set; } = string.Empty;
///
/// パーティションの構成
///
public string PartitionSchema { get; set; } = string.Empty;
///
/// パーティション使用列名
///
public string PartitionKey { get; set; } = string.Empty;
///
/// 項目
///
public List Fields { get; set; } = new List();
///
/// 項目
///
///
///
public virtual Field this[int index]
{
get { return Fields[index]; }
}
///
/// 名称で検索する
///
///
///
public virtual Field? this[string name]
{
get { return Fields.FirstOrDefault(item => item.Name == name); }
}
///
/// メモリー解放
///
public void Dispose()
{
Fields.Clear();
}
///
/// SQL文の作成
/// テーブルを削除してから、新規作成する
///
///
public override string ToString()
{
StringBuilder desc = new StringBuilder();
// テーブルの説明
if (Description.Length > 0)
{
desc.AppendLine($"EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{Description}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{Name}';");
}
StringBuilder cols = new StringBuilder();
StringBuilder pk = new StringBuilder();
foreach(Field item in Fields)
{
if (item.IsPrimaryKey)
{
if(pk.Length > 0) { pk.Append(","); }
pk.Append($"[{item.Name}] ASC");
}
cols.AppendLine($"[{item.Name}] {item.DataType} {(item.IsIdentity ? "IDENTITY(1,1)" : string.Empty)} {(item.IsPrimaryKey ? "NOT" : string.Empty)} NULL,");
if (item.Description.Length > 0)
{
desc.AppendLine($"EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{item.Description}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{Name}', @level2type=N'COLUMN',@level2name=N'{item.Name}';");
}
}
//PARTITION構成の場合、最後にON [PARTITION構成]([列名])
string partition = string.Empty;
if(PartitionSchema.Length > 0) { partition = $"ON [{PartitionSchema}]([{PartitionKey}])"; }
;
return $@"
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{Name}') AND type in (N'U'))
DROP TABLE {Name}
CREATE TABLE [{Name}](
{cols.ToString()}
CONSTRAINT [PK_{Name}] PRIMARY KEY CLUSTERED
(
{pk.ToString()}
)) {partition}
{desc.ToString()}
";
}
}