Sql server 为什么即使Alter Table命令应该完成,此更新仍会引发错误?
这对我来说是一个困扰了一段时间的问题,我想知道为什么这些SQL批处理命令不起作用 我有一个用于保存系统配置设置的表。添加新设置时,我们会向表中添加一个新字段。在更新期间,我需要使用相同的脚本更改服务器上的大量数据库。一般来说,它们都处于相同的状态,我可以执行以下操作:Sql server 为什么即使Alter Table命令应该完成,此更新仍会引发错误?,sql-server,Sql Server,这对我来说是一个困扰了一段时间的问题,我想知道为什么这些SQL批处理命令不起作用 我有一个用于保存系统配置设置的表。添加新设置时,我们会向表中添加一个新字段。在更新期间,我需要使用相同的脚本更改服务器上的大量数据库。一般来说,它们都处于相同的状态,我可以执行以下操作: Alter Table Configuration Add ShowClassesInCheckin bit; GO Update Configuration Set ShowClassesInCheckin=ShowFacil
Alter Table Configuration Add ShowClassesInCheckin bit;
GO
Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;
GO
这个很好用。但是,有时会更新一个或两个数据库,因此我想编写条件逻辑,仅在字段不存在时进行这些更改:
if Not Exists(select * from sys.columns where Name = N'ShowClassesInCheckin' AND Object_ID = Object_ID(N'Configuration'))
BEGIN
Alter Table Configuration Add ShowClassesInCheckin bit;
Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;
END;
GO
在本例中,我得到了一个错误:“无效列名'ShowClassesInCheckin'”,现在,这是有意义的,因为在调用更新之前,Alter表不在批处理中(如果Alter和Update之间没有“GO”,它将无法工作)。但这并没有帮助…我仍然不知道如何实现我所追求的目标…整个SQL脚本在执行之前都经过了解析。在解析阶段,该列将不存在,因此解析器将生成一个错误。在执行脚本的第一行之前引发错误 解决方案是动态SQL:
exec (N'Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;')
在到达
exec
之前,不会对其进行分析,到那时,该列将存在。整个SQL脚本将在执行之前进行分析。在解析阶段,该列将不存在,因此解析器将生成一个错误。在执行脚本的第一行之前引发错误
解决方案是动态SQL:
exec (N'Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;')
在到达
exec
之前,不会对其进行解析,到那时,该列将存在。一个可行的替代方法是重新引入go。这意味着您需要使用其他内容作为更新的条件,可能基于数据库名称
if Not Exists(select * from sys.columns where Name = N'ShowClassesInCheckin' AND Object_ID = Object_ID(N'Configuration'))
BEGIN
Alter Table Configuration Add ShowClassesInCheckin bit;
END;
GO
if *new condition here*
BEGIN
Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;
END;
GO
另一个可行的办法是重新引入围棋。这意味着您需要使用其他内容作为更新的条件,可能基于数据库名称
if Not Exists(select * from sys.columns where Name = N'ShowClassesInCheckin' AND Object_ID = Object_ID(N'Configuration'))
BEGIN
Alter Table Configuration Add ShowClassesInCheckin bit;
END;
GO
if *new condition here*
BEGIN
Update Configuration Set ShowClassesInCheckin=ShowFacilitiesInCheckin;
END;
GO
就这样!你知道,这很有道理。有时候,你只需要从某人那里听到,就可以识别出明显的答案。。。谢谢我发现,一旦有人说出答案,答案总是显而易见的就这样!你知道,这很有道理。有时候,你只需要从某人那里听到,就可以识别出明显的答案。。。谢谢我发现,一旦有人说出答案,答案总是显而易见的嗯……但是第一项将消除我需要测试的条件,以确定是否应该运行第二项。我无法测试该字段是否存在,因为如果存在,用户可能已将其设置为他们想要使用的不同于默认值的值。无论如何,谢谢……嗯……但是第一项将消除我需要测试的条件,以确定是否应该运行第二项。我无法测试该字段是否存在,因为如果存在,用户可能已将其设置为他们想要使用的不同于默认值的值。无论如何谢谢你。。。