【问题标题】:ALTER TABLE my_table ADD @column INTALTER TABLE my_table ADD @column INT
【发布时间】:2011-02-06 12:45:23
【问题描述】:

如果我想使用一个变量作为新列的名称,这在 MS SQL 中可行吗?

不起作用的示例:

ALTER TABLE my_table ADD @column INT

这对我很有用:

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

【问题讨论】:

  • 它给出的错误是什么?
  • @Mahesh Velaga:错误消息无关紧要。这只是 ALTER TABLE 语句的不正确语法
  • 在执行此操作之前对变量 (@Column) 进行清理...这是非常必要的,否则您以后会后悔的

标签: sql-server alter-table


【解决方案1】:

这可以使用动态 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 注入进行清理。
  • ...但这不是一个特别好的主意,因为您最终可能会得到以保留字(列“列”)命名的列,或者包含嵌入空格的列(不寒而栗)。做这件事之前要好好想想!
  • 我经常发现使用 EXEC 是我摆脱困境的第一个迹象。但有时它是最差的替代品
【解决方案2】:

看看 (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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多