SQL 添加后更新列给出 "Invalid column name" 错误

SQL Updating column after adding it giving "Invalid column name" error

我在 SQL Server 2005 中有以下 SQL,但当我 运行 它时,我收到一条错误消息,指出“无效的列名 'ExpIsLocalTime' (ln 7):

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = N'ExpIsLocalTime' AND Object_ID = Object_ID(N'[dbo].[tbl_SessionsAvailable]'))
BEGIN
    ALTER TABLE dbo.tbl_SessionsAvailable ADD
    ExpIsLocalTime bit NOT NULL CONSTRAINT DF_tbl_SessionsAvailable_ExpIsLocalTime DEFAULT (0)

    UPDATE  dbo.tbl_SessionsAvailable
    SET     ExpIsLocalTime = 1
END
GO

这将在一个脚本文件中,该文件可能 运行 不止一次,因此我试图确保 UPDATE 仅 运行 一次。 BEGIN/END是不是有什么东西延迟了DDL语句的执行?

您要执行 UPDATE 的 SQL 查询引用了尚未创建的列。编译时,SQL服务器检测到该列不存在,所以报错"Invalid column name 'ExpIsLocalTime'".

为了在此查询中包含 UPDATE,您需要将其封装在动态 SQL 查询中。换句话说,像这样:

IF NOT EXISTS(SELECT * FROM sys.columns WHERE Name = N'ExpIsLocalTime' AND Object_ID = Object_ID(N'[dbo].[tbl_SessionsAvailable]'))
BEGIN
    ALTER TABLE dbo.tbl_SessionsAvailable ADD
    ExpIsLocalTime bit NOT NULL CONSTRAINT DF_tbl_SessionsAvailable_ExpIsLocalTime DEFAULT (0)

    DECLARE @SQL NVARCHAR(1000)
    SELECT @SQL = N'UPDATE dbo.tbl_SessionsAvailable SET ExpIsLocalTime = 1'
    EXEC sp_executesql @SQL
END
GO

我们在维护 table 的 SQL 脚本中遇到了同样的问题。创建了一个table之后,如果我们以后再给它添加一个列,我们就必须使用动态的SQL来避免这些编译错误。

另一个可能更简单的解决方案是在 Alter 语句之后使用 GO 语句。这会将 DDL 发送到服务器。然后 运行 你剩下的 SQL。如果您使用的是 sqlcmd osql 或 SSMS,这应该有效。