SQL Server 2000 - ALTER TABLE + INSERT INTO = 错误?

16

我正在尝试修改一个表格,以添加一个新列,然后将一行新数据插入其中。

ALTER TABLE Roles ADD ModifiedDate DateTime;
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate)
    VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE())

但我得到:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'ModifiedDate'.
当我尝试在SQL Server Management Studio中运行上述SQL语句时,我认为这是一个工作室错误,而不是服务器错误。如果SQL已经运行,则应该正常工作,因为此时列应该存在。
如何向表中添加新列,然后插入该表?
版本:
- SQL Server 2000 - SQL Server Management Studio 2008
2个回答

20

正如预期的那样,SQL Server 不是逐行执行。它会编译和解析批处理,在这种情况下,该列不存在。

因此,您需要将这两个操作解耦。

ALTER TABLE Roles ADD ModifiedDate DateTime;
EXEC ('
    INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate)
    VALUES (''Name'', ''Description'', 0, 1, GETDATE(), GETDATE())
')

"GO"仅是客户端工具的批处理分隔符,不被服务器所识别。


1
有没有办法关闭这个批处理?我在我的SQL文件中有大约20-30个项目的问题。它正在将一个数据库从一个版本更新到另一个版本。 - Justin808
1
@Justin808:不使用动态SQL或GO命令是无法实现的。这是SQL Server创建执行计划的方式,也是其基本工作原理之一。它并非过程化/逐行执行的。 - gbn
这对我来说似乎是一个巨大的缺点。我期望在文件中更高的项目在遇到文件中较低的项目时被执行。我如何在IF块的中间使用GO,而且如何在不重置所有变量的情况下使用它? - Justin808
或者如果我不应该使用GO,我是否应该将每个语句都包装在EXEC中,以确保它们按预期时间以正确的顺序运行? - Justin808
@Justin808:SQL是声明式的,而不是过程式的。它不是一个命令行脚本或可执行文件。你必须重新编码以使用GO或使用EXEC。 - gbn

0

关于事务处理怎么样?

BEGIN TRANSACTION;
ALTER TABLE Roles ADD ModifiedDate DateTime;
GO;
COMMIT TRANSACTION;

BEGIN TRANSACTION;
INSERT INTO Roles (Name, [Description], CreatedBy, BuiltIn, Created, ModifiedDate) VALUES ('Name', 'Description', 0, 1, GETDATE(), GETDATE());
GO;
COMMIT TRANSACTION;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接