一个BEGIN ... END块内的多个语句

Ale*_*der 4 t-sql sql-server 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_UserProfiles_AllCheckboxesChecked] DEFAULT 0 NOT NULL
  UPDATE [dbo].[UserProfiles] SET [AllCheckboxesChecked]=1 WHERE [CheckedBoxes] LIKE '%#ALL#%'
END
GO
Run Code Online (Sandbox Code Playgroud)

在SSMS中,这可以工作,但在高级安装程序中没有,它失败并显示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
Run Code Online (Sandbox Code Playgroud)

但是这也会引发语法错误(不在SSMS中,只在AdvInst中),所以我想GO在BEGIN ... END块中不允许这样做.连接配置如下:

Connection type: Microsoft SQL Server / MSDE
Connection mode: ODBC Driver
ODBC Driver: SQL Server
Use 64-bit ODBC resource: No
Run Code Online (Sandbox Code Playgroud)

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

Sol*_*zky 7

column doesn't exist错误是由于现有对象上发生的验证造成的.由于表已经存在,解析器/编译器将验证该表是否包含所有引用的列.

为了解决对象验证的这些时间问题,您可以将语句括在一个EXEC在运行时才会被验证的语句:

BEGIN
  ALTER TABLE [dbo].[UserProfiles]
    ADD [AllCheckboxesChecked] [bit]
    CONSTRAINT [DF_UserProfiles_AllCheckboxesChecked] DEFAULT 0
    NOT NULL;

  EXEC(N'UPDATE [dbo].[UserProfiles]
         SET [AllCheckboxesChecked]=1
         WHERE [CheckedBoxes] LIKE ''%#ALL#%''');
END;
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案是正确的,我使用最新版本的Advanced Installer成功测试了它.(PS我们建立AI) (2认同)