Back to all posts

Dynamic CREATE TABLE Script in SQL Server

DECLARE @TableName NVARCHAR(100) = 'Employee'; DECLARE @SQL NVARCHAR(MAX) = ''; DECLARE @PKCols NVARCHAR(MAX) = ''; -- Get Primary Key Column(s) SELECT @PK…

SQL
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_keys
  • sys.foreign_key_columns
  • sys.tables
  • sys.columns
SQL
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.indexes
  • sys.index_columns
  • sys.columns
SQL
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)

SQL
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

Keep building your data skillset

Explore more SQL, Python, analytics, and engineering tutorials.