Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么即使Alter Table命令应该完成,此更新仍会引发错误?_Sql Server - Fatal编程技术网

Sql server 为什么即使Alter Table命令应该完成,此更新仍会引发错误?

Sql server 为什么即使Alter Table命令应该完成,此更新仍会引发错误?,sql-server,Sql Server,这对我来说是一个困扰了一段时间的问题,我想知道为什么这些SQL批处理命令不起作用 我有一个用于保存系统配置设置的表。添加新设置时,我们会向表中添加一个新字段。在更新期间,我需要使用相同的脚本更改服务器上的大量数据库。一般来说,它们都处于相同的状态,我可以执行以下操作: Alter Table Configuration Add ShowClassesInCheckin bit; GO Update Configuration Set ShowClassesInCheckin=ShowFacil

这对我来说是一个困扰了一段时间的问题,我想知道为什么这些SQL批处理命令不起作用

我有一个用于保存系统配置设置的表。添加新设置时,我们会向表中添加一个新字段。在更新期间,我需要使用相同的脚本更改服务器上的大量数据库。一般来说,它们都处于相同的状态,我可以执行以下操作:

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

就这样!你知道,这很有道理。有时候,你只需要从某人那里听到,就可以识别出明显的答案。。。谢谢我发现,一旦有人说出答案,答案总是显而易见的就这样!你知道,这很有道理。有时候,你只需要从某人那里听到,就可以识别出明显的答案。。。谢谢我发现,一旦有人说出答案,答案总是显而易见的嗯……但是第一项将消除我需要测试的条件,以确定是否应该运行第二项。我无法测试该字段是否存在,因为如果存在,用户可能已将其设置为他们想要使用的不同于默认值的值。无论如何,谢谢……嗯……但是第一项将消除我需要测试的条件,以确定是否应该运行第二项。我无法测试该字段是否存在,因为如果存在,用户可能已将其设置为他们想要使用的不同于默认值的值。无论如何谢谢你。。。