2010-04-10 12 views
7

Wenn ich eine Variable als Name der neuen Spalte verwenden möchte, ist das in MS SQL möglich?ALTER TABLE my_table ADD @column INT

Beispiel, die nicht funktionieren:

ALTER TABLE my_table ADD @column INT 

Das ist für mich großartig gearbeitet:

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

Was ist der Fehler seiner geben? –

+0

@Mahesh Velaga: Die Fehlermeldung ist irrelevant. Es ist einfach falsche Syntax für die ALTER TABLE-Anweisung – gbn

+1

Sanitize Sie Variable (@Column), bevor Sie dies tun ... Dies ist sehr wichtig, oder Sie werden später bereuen –

Antwort

14

Dies ist möglich, dynamischen SQL mit Ihrem DDL und mit dem EXEC Befehl baut die Zeichenfolge auszuführen .

Declare @SQL VarChar(1000) 

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

Exec (@SQL) 

Siehe this Artikel.

Ich werde auch hinzufügen, dass der Moment, wenn Sie in das Land der dynamischen sql wagen, müssen Sie darauf achten, sich nicht zu SQL Injection attacks aussetzen. Bereinigen Sie immer die ankommenden Parameter.

Wie Philip erwähnt - denken Sie lange und gründlich darüber nach. Die Tatsache, dass es möglich ist, macht es nicht zu einer guten Sache ...

Erland Sommarskog schrieb einen ausführlichen Artikel über die Verwendung von dynamischen sql - The curse and blessings of dynamic SQL, die ich empfehlen, vollständig zu lesen.

+1

Stellen Sie auch sicher, dass der Wert der Variablen für Fehler und SQL-Injektion bereinigt wird. –

+1

... aber es ist keine besonders gute Idee, wie Sie am Ende mit Spalten mit reservierten Wörtern (Spalte "Spalte") oder (Schauer) mit eingebetteten Leerzeichen enden könnte. Denken Sie lange und hart, bevor Sie dies tun! –

+0

Ich finde oft, dass die Verwendung von EXEC das erste Anzeichen dafür ist, dass ich im Unkraut bin. Aber gelegentlich ist es das Beste von schlechten Alternativen – greg

1

Werfen Sie einen Blick auf (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 
Verwandte Themen