列创建和使用

use*_*516 4 sql sql-server sql-server-2005 alter-table

我对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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译它时,错误,因为UPDATE函数中的CustomerType尚未定义.有没有办法运行它,以便它将编译并添加列并更新它,或者我必须在多次执行中运行它?

谢谢!

mar*_*c_s 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
Run Code Online (Sandbox Code Playgroud)

这适用于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
Run Code Online (Sandbox Code Playgroud)

这段代码检查SQL目录视图sys.columns以查看该表中是否已存在该列 - 如果不存在,则创建该列.当您对表运行此代码一千次时,第一次创建列,并且任何后续运行都不会执行任何操作 - 因为该列已存在.比不断下降和重新添加色谱柱更清洁!