我正在尝试创建一个巨大的脚本,它通过添加/删除/修改现有数据库的列来更新一堆表。一个困扰我的问题是,每当我在一条语句中的表中添加新列并尝试在另一条语句中引用它时,它都会失败并出现有关无效列 xxx的错误。
以下是我用来重现此问题的伪代码,
--CREATE TABLE testTable (u_id int, u_name varchar(10))
--INSERT INTO testTable VALUES (1,'11')
--INSERT INTO testTable VALUES (2,'12')
--INSERT INTO testTable VALUES (3,'13')
--INSERT INTO testTable VALUES (4,'14')
--INSERT INTO testTable VALUES (5,'15')
BEGIN
ALTER table testTable ADD u_add varchar(10)
END
BEGIN
CREATE TABLE tmp_xx_xx_testTable (u_id int, u_name varchar(10), u_add varchar(10))
INSERT INTO dbo.tmp_xx_xx_testTable VALUES (6,'16','DDD' )
INSERT INTO tmp_xx_xx_testTable (u_id,u_name,u_add)
SELECT u_id,u_name,u_add FROM TestTable
drop TABLE TestTable
EXECUTE sp_rename
N'[dbo].[tmp_xx_xx_testTable]',
N'TestTable';
END
--SELECT * FROM testTable
--DROP TABLE testable
第一(和最后)几行只是准备我正在使用的测试表。
当我运行此代码时,出现有关列u_add
无效的错误。但是当我单独运行相同的语句时,它们运行没有任何问题。所以看起来我不明白这里还需要做什么,这样 SQL Server 才能真正“看到”新添加的列。
在语句之间添加批处理分隔符。通常,选择的批次分隔符是
GO
:没有分隔符它失败的原因是,在脚本可以执行之前,它必须被编译,并且为了被编译,每个语句引用的所有对象必须在编译时存在。但是,解析器会遇到引用不存在对象的语句。这些对象应该由脚本中的先前语句创建,但是由于脚本尚未执行,因此它们也尚未创建。结果,缺少的对象无法编译脚本。
添加分隔符等同于突出显示并执行分隔符之间的脚本部分,除了由管理工具(SSMS 或 sqlcmd)自动完成,它在发送脚本(或者,在这种情况下,它的部分)到服务器。