DECLARE @TableName NVARCHAR(100) = 'Employee';
DECLARE @SQL NVARCHAR(MAX) = '';
DECLARE @PKCols NVARCHAR(MAX) = '';
-- Get Primary Key Column(s)
SELECT @PKCols = STRING_AGG(c.COLUMN_NAME, ', ')
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
ON tc.CONSTRAINT_NAME = c.CONSTRAINT_NAME
WHERE tc.TABLE_NAME = @TableName
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY';
-- Build column list dynamically
SELECT @SQL = @SQL + CHAR(13) +
COLUMN_NAME + ' ' + DATA_TYPE +
CASE
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL
AND DATA_TYPE IN ('varchar','nvarchar','char','nchar')
THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN DATA_TYPE IN ('decimal','numeric')
THEN '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ',' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
ELSE ''
END +
CASE
WHEN COLUMNPROPERTY(OBJECT_ID(@TableName), COLUMN_NAME, 'IsIdentity') = 1 THEN ' IDENTITY(1,1)'
ELSE ''
END +
CASE
WHEN DATA_TYPE IN ('datetime','date')
THEN CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END
ELSE
CASE
WHEN COLUMNPROPERTY(OBJECT_ID(@TableName), COLUMN_NAME, 'IsIdentity') = 1 THEN ''
ELSE ' CONSTRAINT DF_' + @TableName + '_' + COLUMN_NAME +
CASE
WHEN DATA_TYPE IN ('varchar','nvarchar','char','nchar') THEN ' DEFAULT ('''')'
WHEN DATA_TYPE IN ('int','tinyint','smallint','bigint','bit','decimal','numeric','float','money','smallmoney') THEN ' DEFAULT (0)'
ELSE ' DEFAULT (NULL)'
END
END +
CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END
END + ','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName
ORDER BY ORDINAL_POSITION;
-- Remove last comma
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1);
-- Add Primary Key if exists
IF @PKCols IS NOT NULL
SET @SQL = 'IF NOT EXISTS (
SELECT 1 FROM sys.tables
WHERE name = '+QUOTENAME(@TableName,'''')+'
)
BEGIN
CREATE TABLE (' + CHAR(13) + @SQL + ',' + CHAR(13) +
'PRIMARY KEY (' + @PKCols + ')' + CHAR(13) + '); END';
ELSE
SET @SQL = 'CREATE TABLE (' + CHAR(13) + @SQL + CHAR(13) + ');
END
GO';
PRINT @SQL;
What This Script Does (High Level)
Ye script automatically:
✅ Table ke saare columns read karta hai
✅ Data types + length/precision add karta hai
✅ Identity column detect karta hai
✅ Default constraints create karta hai
✅ NOT NULL / NULL handle karta hai
✅ Primary Key automatically add karta hai
✅ Table already exist ho to duplicate creation se bachata hai
Limitations (Honest Truth)
❌ Foreign keys include nahi hote
❌ Indexes (non-PK) nahi aate
❌ Check constraints skip ho jate hain
❌ Computed columns handle nahi karta
Foreign Key Constraints – Automatically Generate
🔍 Foreign Keys kaha stored hote hain?
SQL Server FK info rakhta hai:
sys.foreign_keyssys.foreign_key_columnssys.tablessys.columns
DECLARE @FKSQL NVARCHAR(MAX) = '';
SELECT @FKSQL = @FKSQL + '
ALTER TABLE
ADD CONSTRAINT
FOREIGN KEY (' + pc.name + ')
REFERENCES (' + rc.name + ');'
FROM sys.foreign_keys fk
JOIN sys.foreign_key_columns fkc
ON fk.object_id = fkc.constraint_object_id
JOIN sys.columns pc
ON fkc.parent_column_id = pc.column_id
AND fkc.parent_object_id = pc.object_id
JOIN sys.columns rc
ON fkc.referenced_column_id = rc.column_id
AND fkc.referenced_object_id = rc.object_id
WHERE OBJECT_NAME(fk.parent_object_id) = @TableName;

Non-Clustered Indexes (PK ke alawa)
Primary Key to aa hi chuka.
Ab performance ke liye indexes bhi chahiye 🔥
🔍 Index Metadata Source
sys.indexessys.index_columnssys.columns
DECLARE @IndexSQL NVARCHAR(MAX) = '';
SELECT @IndexSQL = @IndexSQL + '
CREATE ' +
CASE WHEN i.is_unique = 1 THEN 'UNIQUE ' ELSE '' END +
i.type_desc + ' INDEX
ON (' + STRING_AGG(c.name, ', ') + ');'
FROM sys.indexes i
JOIN sys.index_columns ic
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
JOIN sys.columns c
ON ic.object_id = c.object_id AND ic.column_id = c.column_id
JOIN sys.tables t
ON i.object_id = t.object_id
WHERE t.name = 'Employee'
AND i.is_primary_key = 0
GROUP BY i.name, i.type_desc, i.is_unique, t.name;
print @IndexSQL

Check Constraints (Business Rules)
DECLARE @CheckSQL NVARCHAR(MAX) = '';
SELECT @CheckSQL = @CheckSQL + '
ALTER TABLE
ADD CONSTRAINT CHECK ' + definition + ';'
FROM sys.check_constraints
WHERE OBJECT_NAME(parent_object_id) = 'Employee';
print @CheckSQL
