Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 一个BEGIN中有多个语句。。。端块_Sql Server_Tsql_Advanced Installer - Fatal编程技术网

Sql server 一个BEGIN中有多个语句。。。端块

Sql server 一个BEGIN中有多个语句。。。端块,sql-server,tsql,advanced-installer,Sql Server,Tsql,Advanced Installer,在我的安装程序中,我必须对架构进行一个小的更改: IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[UserProfiles]') AND name = 'AllCheckboxesChecked') BEGIN ALTER TABLE [dbo].[UserProfiles] ADD [AllCheckboxesChecked] [bit] CONSTRAINT [DF_UserPro

在我的安装程序中,我必须对架构进行一个小的更改:

IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[UserProfiles]') AND name = 'AllCheckboxesChecked')
BEGIN
  ALTER TABLE [dbo].[UserProfiles] ADD [AllCheckboxesChecked] [bit] CONSTRAINT [DF_UserProfiles_AllCheckboxesChecked] DEFAULT 0 NOT NULL
  UPDATE [dbo].[UserProfiles] SET [AllCheckboxesChecked]=1 WHERE [CheckedBoxes] LIKE '%#ALL#%'
END
GO
在SSMS中,这是可行的,但在Advanced Installer中则不行,在高级安装程序中,它会失败,错误消息是列AllCheckboxesChecked不存在。所以我试着:

IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[UserProfiles]') AND name = 'AllCheckboxesChecked')
BEGIN
  ALTER TABLE [dbo].[UserProfiles] ADD [AllCheckboxesChecked] [bit] CONSTRAINT [DF_UserProfiles_AllCheckboxesChecked] DEFAULT 0 NOT NULL
  GO
  UPDATE [dbo].[UserProfiles] SET [AllCheckboxesChecked]=1 WHERE [CheckedBoxes] LIKE '%#ALL#%'
END
GO
但是这也会引发语法错误(不是在SSMS中,只是在advist中),所以我猜在BEGIN…END块中不允许
GO
。连接配置如下:

Connection type: Microsoft SQL Server / MSDE
Connection mode: ODBC Driver
ODBC Driver: SQL Server
Use 64-bit ODBC resource: No

如果安装程序在尚未存在列的数据库上运行,我可以采取哪些步骤来创建列并用正确的值填充该列?

语句是批处理终止符,批处理中的项仅在批处理结束时提交,在下一个
GO
语句或到达脚本末尾时。在您的情况下,包含
ALTER COLUMN
语句的批处理尚未提交,因此您会得到一个错误,即该列不存在。您必须将脚本分为两部分。

列不存在。错误是由于在现有对象上进行验证而导致的。由于该表已经存在,解析器/编译器将验证该表是否包含所有引用的列

为了解决对象验证的时间问题,您可以将语句封装在
EXEC
中,直到运行时才会验证该语句:

开始
ALTER TABLE[dbo].[UserProfiles]
添加[AllCheckboxesChecked][bit]
约束[DF_UserProfiles_allcheckbox schecked]默认值0
不为空;
EXEC(N'UPDATE[dbo].[UserProfiles]
设置[AllCheckboxesChecked]=1
其中[复选框]类似于“%#ALL#%”;
结束;

GO是一个批处理终止符-它特定于您正在使用的工具,而不是SQL Server-因此如果您将

Statement1
GO
Statemetn2
将作为两个单独的执行(批处理)发送到SQL Server


基本上,您将查询分为两个批,第一批不关闭开始块,第二批不启动结束块

go
出现在语句末尾。而不是在between@juergend你在第一步之前做了第二步。我写道我已经猜到了。但是请回答我的第一个问题,为什么它失败了,并显示AllCheckboxesChecked列不存在;我会尽快检查它(这意味着明天早上CET)。这个解决方案是正确的,我用最新版本的高级安装程序成功地测试了它。(注:我们构建人工智能)