【问题标题】:SQL Server 2000 - ALTER TABLE + INSERT INTO = Errors?SQL Server 2000 - ALTER TABLE + INSERT INTO = 错误?
【发布时间】:2011-06-18 20:07:27
【问题描述】:

我正在尝试更改表格以添加新列,然后在其中插入新行。

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 时。我认为这是 Studio 错误,而不是服务器错误。如果 SQL 已运行,它应该会像该列存在一样工作。

如何将新列添加到表中,然后插入到该表中?

版本:

  • SQL Server 2000
  • SQL Server Management Studio 2008

【问题讨论】:

    标签: sql-server tsql sql-server-2000


    【解决方案1】:

    正如预期的那样。 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”是仅用于客户端工具的批处理分隔符,服务器无法识别

    【讨论】:

    • 有没有办法关闭这个批处理?我的 SQL 文件中有大约 20 -30 个项目有这个问题。它将数据库从一个版本更新到另一个版本。
    • @Justin808:不是没有动态 SQL 或 GO。这是 SQL Server 创建执行计划的方式,也是其工作方式的基础。这不是程序/逐行。
    • 这对我来说似乎是一个巨大的缺点。我希望当文件中较低的项目被命中时,文件中较高的项目会被完成。如何在 IF 块中间使用 GO,如何在不重置所有变量的情况下使用它?
    • 或者如果我不应该使用 GO,我是否将每条语句包装在一个 EXEC 中以确保它们在预期的时间以正确的顺序运行?
    • @Justin808:SQL 是声明性的,而不是程序性的。它不是命令行脚本或可执行文件。您必须重新编码才能使用 GO 或使用 EXEC
    【解决方案2】:

    交易呢?

    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;
    

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多