2010-04-10 16 views
7

Se si desidera utilizzare una variabile come nome della nuova colonna, questo è possibile in MS SQL?ALTER TABLE my_table ADD @column INT

Esempio che non funzionano:

ALTER TABLE my_table ADD @column INT 

Questo ha funzionato grande per me:

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

Qual è l'errore relativo dare? –

+0

@Mahesh Velaga: il messaggio di errore è irrilevante. è semplicemente sintassi errata per l'istruzione ALTER TABLE – gbn

+1

Sanitize you variable (@Column) prima di fare questo ... Questo è molto essenziale o te ne pentirai dopo –

risposta

14

Questo è possibile utilizzando SQL dinamico per costruire il tuo DDL e utilizzando il comando EXEC per eseguire la stringa .

Declare @SQL VarChar(1000) 

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

Exec (@SQL) 

Vedere articolo this.

Aggiungo anche che nel momento in cui ti avventuri nella terra di SQL dinamico, devi stare attento a non esporsi a SQL Injection attacks. Pulisci sempre i parametri che arrivano.

Come menziona Philip - pensa molto a lungo prima di farlo. Il fatto che sia possibile non lo rende una buona cosa ...

Erland Sommarskog ha scritto un ampio articolo sull'utilizzo di SQL dinamico - The curse and blessings of dynamic SQL che consiglio di leggere completamente.

+1

Assicurati anche che il valore della variabile sia sterilizzato per errori e sql injection. –

+1

... ma non è una buona idea, dato che potresti finire con colonne chiamate con parole riservate (colonna "colonna") o (shudder) contenenti spazi incorporati. Pensa a lungo e duramente prima di farlo! –

+0

Spesso mi accorgo che usare EXEC è il primo segnale che non sono nelle erbacce. Ma occasionalmente è la migliore delle scarse alternative – greg

1

Dai un'occhiata alla (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