4

我对 SQL 很陌生,所以不确定这是否只是 SQL 编译器的事情。当我在通过 JAVA 或 PHP 之前使用过 SQL 时,绝不是直接使用 SQL。我正在使用 SQL Server 2005 并尝试向我的表中添加一列,然后填充它。这是我现在拥有的:

ALTER TABLE House DROP COLUMN CustomerType
ALTER TABLE House ADD CustomerType char(11)

UPDATE House
SET CustomerType = CASE
    WHEN ... THEN...
    WHEN ... THEN...
    ELSE "Other"
    END

但是,当我尝试编译它时,它会出错,因为尚未定义 UPDATE 函数中的 CustomerType。有什么方法可以运行它,以便它编译并添加列并更新它,还是我必须在多次执行中运行它?

谢谢!

4

4 回答 4

9

每个操作使用多个文件,或在步骤之间放置“GO”:

ALTER TABLE House DROP COLUMN CustomerType
GO

ALTER TABLE House ADD CustomerType char(11)
GO

UPDATE House
SET CustomerType = CASE
    WHEN ... THEN...
    WHEN ... THEN...
    ELSE "Other"
    END
GO

这适用于 SQL Server Management Studio - 它不是 T-SQL 功能,而是 Mgmt Studio 的一个功能,用于分离 SQL 命令的 T-SQL“批次”。

更新:如果你想让你的脚本可以运行多次,更有用的方法是检查列的存在,并且只在它不存在时添加它 - 总是删除并重新-添加它,如果它已经存在的话!

为此,请使用以下内容:

IF NOT EXISTS(SELECT * FROM sys.columns WHERE name = 'CustomerType' 
                       AND object_id = OBJECT_ID('House'))
   ALTER TABLE dbo.House ADD CustomerType CHAR(11)
GO

这段代码检查 SQL 目录视图sys.columns以查看该表中是否已存在该列 - 如果不存在,则创建该列。当您对您的表运行此代码一千次时,第一次,该列被创建,并且任何后续运行都不会执行任何操作 - 因为该列已经存在。比不断删除和重新添加一列要干净得多!

于 2010-08-11T15:43:33.973 回答
4

GO尝试在第二个ALTER陈述之后和您的陈述之前放置一个UPDATE陈述。

于 2010-08-11T15:42:42.207 回答
1

也许您必须在执行 UPDATE 之前提交对模式的更改。

架构 DDL 应该在您到达 DML/DQL 时解决。为什么您认为您必须不断删除和添加该列?

于 2010-08-11T15:44:32.723 回答
1

它必须比您上面显示的更多。我不能让一个非常相似的脚本失败;以下作品非常好:

CREATE TABLE #House (housekey int, number int, street char(20))

insert into #House (housekey, number, street) values (1, 123, 'Wilson Ave')
insert into #House (housekey, number, street) values (2, 124, 'Wilson Ave')
insert into #House (housekey, number, street) values (3, 125, 'Wilson Ave')

alter table #House DROP COLUMN street
alter table #House ADD street varchar(20)

update #House
set street = case
    when number = 123 then 'Wilson Ave'
    when number = 124 then 'Willson Ave'
    when number = 125 then 'Wulson Ave'
    else 'Xxy St'
end

select * from #house

drop table #house

我认为通过在某些部分后面加上“GO”来分解脚本的想法会很有效,但是当我开始运行这个东西时,我不能让它失败。

换句话说,“它可以在我的机器上运行。” 有什么你留下的可能会有所作为的吗?

编辑添加:是的,GO 就是答案。我承认,“它在我的机器上工作”有点不负责任,因为这个问题没有处理临时表——而是一个普通的。我使用永久表尝试了该问题,并得到了与提问者相同的结果,GO 修复了它。实际上,从一开始,这似乎是合乎逻辑的。

于 2010-08-11T15:57:19.427 回答