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,这应该有效。
我在 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,这应该有效。