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)。这个解决方案是正确的,我用最新版本的高级安装程序成功地测试了它。(注:我们构建人工智能)