如果我想使用一個變量作爲新列的名稱,這在MS SQL中是否可行?ALTER TABLE my_table ADD @column INT
例子不工作:
ALTER TABLE my_table ADD @column INT
這對我來說真是棒極了:
EXEC ('ALTER TABLE my_table ADD ' + @column + ' INT')
如果我想使用一個變量作爲新列的名稱,這在MS SQL中是否可行?ALTER TABLE my_table ADD @column INT
例子不工作:
ALTER TABLE my_table ADD @column INT
這對我來說真是棒極了:
EXEC ('ALTER TABLE my_table ADD ' + @column + ' INT')
這是可能的使用動態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,我建議閱讀完整。
還要確保變量的值已針對錯誤和sql注入進行了清理。 – 2010-04-10 16:45:23
...但它並不是一個特別好的主意,因爲最後可能會有以保留字命名的列(列「column」)或包含嵌入空格的(shudder)。在你做這件事之前,先思考並且努力吧! – 2010-04-10 16:46:39
我經常發現使用EXEC是我在雜草中脫穎而出的第一個跡象。但偶爾它是最好的可憐的替代品 – greg 2013-11-05 21:56:47
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
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
什麼是錯誤的捐贈? – 2010-04-10 16:44:14
@Mahesh Velaga:錯誤信息是無關緊要的。這只是ALTER TABLE語句的不正確語法 – gbn 2010-04-11 08:48:08
在執行此操作之前清理變量(@Column)...這非常重要,否則您會後悔 – 2010-06-17 15:10:21