using System.Collections.Generic;
public static void Main()
TableBuilder builder = new TableBuilder();
builder.Create("table1", (table) => new
Id = table.Column("int", false).Annotation("SqlServer:Identity", "1,1").GetColumnDetails(),
Name = table.Column("nvarchar", false).GetColumnDetails(),
Age = table.Column("int", true).GetColumnDetails()
builder.Create("table2", (table) => new
Id = table.Column("UNIQUEIDENTIFIER", false, defaultValue: "NEWID()").GetColumnDetails(),
Data = table.Column("nvarchar", true).GetColumnDetails()
table.PrimaryKey("PK_table2", "Id")
public class TableBuilder
private string TableGenQuery;
private string TableAlterQuery;
private string TableDropQuery;
public ColumnBuilder ColumnBuilder { get; }
public void CreateTable(string name, Func<ColumnBuilder, ColumnBuilder> columns)
var columnBuilder = new ColumnBuilder();
columns.Invoke(columnBuilder);
Console.WriteLine("Columns: {0}", columnBuilder.GetType());
public void Create(string name, Func<ColumnBuilder, object> columns, Func<ConstraintBuilder, string> constraint)
ColumnBuilder columnBuilder = new();
ConstraintBuilder constraintBuilder = new();
var eleColumns = columns.Invoke(columnBuilder);
var eleConstraint = constraint.Invoke(constraintBuilder);
StringBuilder sb = new StringBuilder();
sb.AppendLine($"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{name}]') AND type in (N'U')");
sb.AppendLine($"CREATE TABLE [dbo].[{name}](");
foreach (var ele in (eleColumns.GetType().GetProperties()))
sb.AppendLine($"[{ele.Name}] {ele.GetValue(eleColumns)},");
if (!string.IsNullOrEmpty(eleConstraint))
sb.AppendLine(eleConstraint);
sb.Remove(sb.Length - 3, 2);
sb.AppendLine(") ON [PRIMARY]");
string tableGenQuery = sb.ToString();
Console.WriteLine(tableGenQuery);
public class ColumnBuilder
private string ColumnDetail { get; set; }
public ColumnBuilder() { }
public ColumnBuilder Column(string type, bool isNullable, object defaultValue = null, int? maxLength = null)
string nullable = isNullable ? "NULL" : "NOT NULL";
string maxLen = maxLength != null ? $"({maxLength})" : "";
string defaultVal = defaultValue != null ? $"DEFAULT {defaultValue}" : "";
ColumnDetail = $"{type}{maxLen} {nullable} {defaultVal}";
public ColumnBuilder Annotation(string name, string value)
if (name.Contains("Identity"))
ColumnDetail = $"{ColumnDetail} IDENTITY({value})";
public string GetColumnDetails()
public class ConstraintBuilder
private string ConstraintDetail { get; set; }
public ConstraintBuilder() { }
public string PrimaryKey(string name, string column)
ConstraintDetail = $@"CONSTRAINT [{name}] PRIMARY KEY CLUSTERED
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]";