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上运行,我可以采取哪些步骤来创建列并使用正确的值填充?
该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)