В общем случае DDL операторы, то есть те, которые определяют таблицы и столбцы, не принимают переменные для имен таблиц или столбцов.
Иногда это можно обойти, подготовив операторы, но поддержка подготовленных DDL предоставляется не всеми механизмами баз данных.
Следующий пример работает в SQL Server 2005, хотя я хотел бы предположить, что динамическое добавление столбцов может быть не оптимальным решением
DECLARE @colname1 VARCHAR(10)
DECLARE @colname2 VARCHAR(10)
DECLARE @sql VARCHAR(MAX)
SET @colname1 = 'col1'
SET @colname2 = 'col2'
SET @sql = 'CREATE TABLE temptab (' + @colname1 + ' VARCHAR(10) )'
EXEC (@sql)
INSERT INTO temptab VALUES ('COl 1')
SET @sql = 'ALTER TABLE temptab ADD ' + @colname2 + ' VARCHAR(10)'
EXEC (@sql)
INSERT INTO temptab VALUES ('Col1', 'Col2')
SELECT * FROM temptab
DROP TABLE temptab
Дали следующие результаты
col1 col2
---------- ----------
COl 1 NULL
Col1 Col2