2010-04-10 21 views
7

Si quiero usar una variable como el nombre de la nueva columna, es posible este en MS SQL?ALTER TABLE ADD my_table @column INT

Ejemplo que no trabajan:

ALTER TABLE my_table ADD @column INT 

Esto funcionó muy bien para mí:

EXEC ('ALTER TABLE my_table ADD ' + @column + ' INT') 
+0

¿Cuál es el error de sus donaciones? –

+0

Velaga @Mahesh: el mensaje de error es irrelevante. es simplemente una sintaxis incorrecta para la instrucción ALTER TABLE – gbn

+1

Esterilice que la variable (@Column) antes de hacer esto ... Esto es muy esencial o se van a arrepentir más tarde –

Respuesta

14

Esto es posible utilizando SQL dinámico para construir su DDL y usando el comando EXEC para ejecutar la cadena .

Declare @SQL VarChar(1000) 

SELECT @SQL = 'ALTER TABLE my_table ADD ' + @column + ' INT' 

Exec (@SQL) 

Ver artículo this.

También agregaré que en el momento que se aventura a la tierra de sql dinámico, debe tener cuidado de no exponerse al SQL Injection attacks. Siempre limpie los parámetros que entra

Como se menciona Felipe -. Pensar largo y tendido antes de hacer esto. El hecho de que sea posible no lo hace bueno ...

Erland Sommarskog escribió un extenso artículo sobre el uso del sql dinámico - The curse and blessings of dynamic SQL que recomiendo leer completamente.

+1

También asegúrese de que el valor de la variable es verificada por los errores y la inyección de SQL. –

+1

... pero no es particularmente buena idea, ya que podría terminar con columnas llamadas con palabras reservadas (columna "columna"), o (temblor) que contiene espacios incrustados. ¡Piense mucho antes de hacer esto! –

+0

A menudo parece que el uso EXEC es la primera señal de que estoy fuera de las malas hierbas. Pero ocasionalmente es la mejor de las alternativas pobres – greg

1

Tener un vistazo a (EXECUTE (Transact-SQL))

CREATE TABLE MyTable(
     ID INT 
) 
GO 
SELECT * FROM MyTable 
GO 
DECLARE @column VARCHAR(100) 
SET @column = 'MyNewCol' 
EXEC('ALTER TABLE MyTable ADD ' + @column + ' INT') 
GO 
SELECT * FROM MyTable 
GO 
DROP TABLE MyTable 
0
alter procedure sp_check_table_column 
(
    @field_name varchar(max), 
    @data_type varchar(max), 
    @mandatory varchar(max) 
) 
as 
if not exists (select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '<table_name>' and COLUMN_NAME = @field_name) 
begin 
declare @sql varchar(max) 
set @sql = ('ALTER TABLE <table_name> ADD ' + @field_name + ' ' + @data_type + ' ' + @mandatory) 
exec (@sql) 
end 
Cuestiones relacionadas