2010-04-10 8 views
7

Jeśli chcę użyć zmiennej jako nazwy nowej kolumny, czy jest to możliwe w MS SQL?ALTER TABLE my_table ADD @column INT

przykład, że nie praca:

ALTER TABLE my_table ADD @column INT 

To był świetny dla mnie:

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

Jaki jest błąd dając jej? –

+0

@Mahesh Velaga: komunikat o błędzie jest nieistotny. jest to po prostu niepoprawna składnia dla instrukcji ALTER TABLE – gbn

+1

Sanitize you variable (@Column) zanim to zrobisz ... Jest to bardzo istotne lub będziesz żałować później –

Odpowiedz

14

Jest to możliwe za pomocą dynamicznego SQL zbudować DDL i za pomocą komendy EXEC wykonać ciąg .

Declare @SQL VarChar(1000) 

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

Exec (@SQL) 

Zobacz artykuł this.

Dodam również, że w momencie, gdy zapuścisz się do kraju dynamicznego sql, musisz uważać, aby nie narazić się na SQL Injection attacks. Zawsze usuwaj parametry.

Jak wspomina Philip - długo i ciężko się nad tym zastanowić. Fakt, że jest to możliwe, nie czyni go dobrym ...

Erland Sommarskog napisał obszerny artykuł na temat korzystania z dynamicznego sql - The curse and blessings of dynamic SQL, który zalecam do czytania w pełni.

+1

Upewnij się również, że wartość zmiennej jest oczyszczona dla błędów i iniekcji sql. –

+1

... ale nie jest to szczególnie dobry pomysł, ponieważ mógłbyś skończyć z kolumnami nazwanymi słowami zastrzeżonymi (kolumna "kolumna") lub (dreszczem) zawierającymi osadzone spacje. Zastanów się długo i ciężko, zanim to zrobisz! –

+0

Często stwierdzam, że używanie EXEC jest pierwszym znakiem, że jestem w chwastach. Ale okazjonalnie jest to najlepsza z marnych alternatyw – greg

1

Zapraszamy do obejrzenia (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 
Powiązane problemy