DECLARE @EntityName NVARCHAR(128) = 'Company'; -- USER INPUT
DECLARE @Sql NVARCHAR(MAX);
/* =========================
Derived Names
========================= */
DECLARE @MainTable NVARCHAR(128) = QUOTENAME(@EntityName);
DECLARE @TypeTable NVARCHAR(128) = QUOTENAME(@EntityName + 'Type');
DECLARE @LinkTable NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName + 'Type');
DECLARE @SelfRelTable NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName);
DECLARE @RelTypeTable NVARCHAR(128) = QUOTENAME(@EntityName + 'RT');
DECLARE @SelfRelLinkTable NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName + '_' + @EntityName + 'RT');
DECLARE @EntityIdCol NVARCHAR(128) = QUOTENAME(@EntityName + 'Id');
DECLARE @EntityNameCol NVARCHAR(128) = QUOTENAME(@EntityName + 'Name');
DECLARE @EntityDescCol NVARCHAR(128) = QUOTENAME(@EntityName + 'Description');
DECLARE @EntityTypeIdCol NVARCHAR(128) = QUOTENAME(@EntityName + 'TypeId');
DECLARE @EntityTypeNameCol NVARCHAR(128)= QUOTENAME(@EntityName + 'TypeName');
DECLARE @LinkIdCol NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName + 'TypeId');
DECLARE @SelfRelIdCol NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName + 'Id');
DECLARE @Entity1IdCol NVARCHAR(128) = QUOTENAME(@EntityName + '1Id');
DECLARE @Entity2IdCol NVARCHAR(128) = QUOTENAME(@EntityName + '2Id');
DECLARE @RTIdCol NVARCHAR(128) = QUOTENAME(@EntityName + 'RTId');
DECLARE @RTNameCol NVARCHAR(128) = QUOTENAME(@EntityName + 'RTName');
DECLARE @SelfRelLinkIdCol NVARCHAR(128) = QUOTENAME(@EntityName + '_' + @EntityName + '_' + @EntityName + 'RTId');
/* =========================
1️⃣ Main Table
========================= */
SET @Sql = '
CREATE TABLE ' + @MainTable + ' (
' + @EntityIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @EntityNameCol + ' NVARCHAR(MAX),
' + @EntityDescCol + ' NVARCHAR(MAX),
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL
);';
EXEC sp_executesql @Sql;
/* =========================
2️⃣ Type Table
========================= */
SET @Sql = '
CREATE TABLE ' + @TypeTable + ' (
' + @EntityTypeIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @EntityTypeNameCol + ' NVARCHAR(MAX),
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL
);';
EXEC sp_executesql @Sql;
/* =========================
3️⃣ Entity ↔ Type Link Table
========================= */
SET @Sql = '
CREATE TABLE ' + @LinkTable + ' (
' + @LinkIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @EntityIdCol + ' BIGINT,
' + @EntityTypeIdCol + ' BIGINT,
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL,
CONSTRAINT FK_' + @EntityName + '_ET_Main
FOREIGN KEY (' + @EntityIdCol + ')
REFERENCES ' + @MainTable + '(' + @EntityIdCol + '),
CONSTRAINT FK_' + @EntityName + '_ET_Type
FOREIGN KEY (' + @EntityTypeIdCol + ')
REFERENCES ' + @TypeTable + '(' + @EntityTypeIdCol + ')
);';
EXEC sp_executesql @Sql;
/* =========================
4️⃣ Self Relation Table
========================= */
SET @Sql = '
CREATE TABLE ' + @SelfRelTable + ' (
' + @SelfRelIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @Entity1IdCol + ' BIGINT,
' + @Entity2IdCol + ' BIGINT,
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL,
CONSTRAINT FK_' + @EntityName + '_SR_Entity1
FOREIGN KEY (' + @Entity1IdCol + ')
REFERENCES ' + @MainTable + '(' + @EntityIdCol + '),
CONSTRAINT FK_' + @EntityName + '_SR_Entity2
FOREIGN KEY (' + @Entity2IdCol + ')
REFERENCES ' + @MainTable + '(' + @EntityIdCol + ')
);';
EXEC sp_executesql @Sql;
/* =========================
5️⃣ Relationship Type Table
========================= */
SET @Sql = '
CREATE TABLE ' + @RelTypeTable + ' (
' + @RTIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @RTNameCol + ' NVARCHAR(MAX),
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL
);';
EXEC sp_executesql @Sql;
/* =========================
6️⃣ Self Relation ↔ RelationshipType Link Table
========================= */
SET @Sql = '
CREATE TABLE ' + @SelfRelLinkTable + ' (
' + @SelfRelLinkIdCol + ' BIGINT IDENTITY(1,1) PRIMARY KEY,
' + @SelfRelIdCol + ' BIGINT,
' + @RTIdCol + ' BIGINT,
CreatedBy NVARCHAR(MAX) NULL,
CreatedAt DATETIME NULL,
CONSTRAINT FK_' + @EntityName + '_SRL_SelfRel
FOREIGN KEY (' + @SelfRelIdCol + ')
REFERENCES ' + @SelfRelTable + '(' + @SelfRelIdCol + '),
CONSTRAINT FK_' + @EntityName + '_SRL_RT
FOREIGN KEY (' + @RTIdCol + ')
REFERENCES ' + @RelTypeTable + '(' + @RTIdCol + ')
);';
EXEC sp_executesql @Sql;