【问题标题】:adding a column in stored procedure在存储过程中添加列
【发布时间】:2012-09-03 17:11:49
【问题描述】:

我可以有一个存储过程来向表中添加一个新列并处理该列的后记吗?例如,我有以下存储过程:

...

alter table tb1
add col1 varchar(1) null

insert into tb1(col1)
values ('Y')

我收到一个错误提示

col1 无效。

【问题讨论】:

  • 添加列后是否执行go命令?
  • 你不能在存储过程中间有GO语句
  • SQL Server 在您创建 proc 时检查该列是否存在,因此您必须手动添加该列,创建 proc,然后删除该列才能使其正常工作。我会建议 @LittleBobbyTables 添加的动态 SQL 解决方法,尽管可能使用 sp_executesql 代替。

标签: sql-server sql-server-2008 tsql stored-procedures alter-table


【解决方案1】:

尝试使用默认值“Y”创建表,而不是在之后插入这些值。

alter table tb1 add col1 varchar(1) not null DEFAULT ('Y')

根据GO 文档,您需要在两行之间添加GO 才能创建表格:

SQL Server 实用程序将 GO 解释为它们应该将当前批次的 Transact-SQL 语句发送到 SQL Server 实例的信号。

但是,您不能在存储过程中使用 GO 语句。

编辑

或者,您可以使用EXEC 语句来执行您的代码:

EXEC ('alter table tb1 add col1 varchar(1) null')
EXEC ('update tb1 set col1 = ''Y''')

【讨论】:

  • 我只是举个例子,实际上我在存储过程中还有很多其他的事情要做。我只是想知道我是否必须在存储过程之外更改表?
  • 一般来说,更改存储过程之外的表是一个更好的选择。您真的想在每次 proc 运行时添加一列还是只添加一次?另外,您应该将所有结构更改保存为 SQl 脚本并放入源代码管理中,以便更轻松地将它们移动到 prod 或在 anotehr 服务器上重新创建数据库。
  • EXEC(N'ALTER TABLE ...') 声明对我有用。谢谢!
【解决方案2】:

我是这样弄的,那你就不用担心SQL注入了:

ALTER PROCEDURE Add_DB_Field

(@FieldName varchar(100))

AS

ALTER TABLE Readings ADD tmpCol VARCHAR(100) NULL

EXEC sp_RENAME 'Readings.tmpCol' , @FieldName, 'COLUMN'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多