2010-04-10 134 views
7

如果我想使用一個變量作爲新列的名稱,這在MS SQL中是否可行?ALTER TABLE my_table ADD @column INT

例子不工作:

ALTER TABLE my_table ADD @column INT 

這對我來說真是棒極了:

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

什麼是錯誤的捐贈? – 2010-04-10 16:44:14

+0

@Mahesh Velaga:錯誤信息是無關緊要的。這只是ALTER TABLE語句的不正確語法 – gbn 2010-04-11 08:48:08

+1

在執行此操作之前清理變量(@Column)...這非常重要,否則您會後悔 – 2010-06-17 15:10:21

回答

14

這是可能的使用動態SQL構建DDL和使用EXEC要執行的命令字符串。

Declare @SQL VarChar(1000) 

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

Exec (@SQL) 

請參閱this文章。

我還會補充一點,當你冒險進入動態sql領域時,你需要注意不要讓自己暴露於SQL Injection attacks。始終清理參數進來。

正如菲利普提到的 - 在做這件事之前想想很久很久。有可能的事實並不是一件好事...

Erland Sommarskog寫了一篇關於使用動態sql的廣泛文章 - The curse and blessings of dynamic SQL,我建議閱讀完整。

+1

還要確保變量的值已針對錯誤和sql注入進行了清理。 – 2010-04-10 16:45:23

+1

...但它並不是一個特別好的主意,因爲最後可能會有以保留字命名的列(列「column」)或包含嵌入空格的(shudder)。在你做這件事之前,先思考並且努力吧! – 2010-04-10 16:46:39

+0

我經常發現使用EXEC是我在雜草中脫穎而出的第一個跡象。但偶爾它是最好的可憐的替代品 – greg 2013-11-05 21:56:47

1

看一看(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 
相關問題