Оператор SQL IF игнорируется

У меня длинный скрипт, и мне нравится иметь возможность запускать весь файл, когда мне нужно, и не беспокоиться о том, что его часть уже запущена. Но сценарий ниже дает мне проблемы. По какой-то причине он выходит за утверждение IF, даже если столбцы EntityID и EntityType не существуют, и в этом случае он не должен проходить через инструкцию IF. Может кто-нибудь сказать мне, что не так?

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Notes' AND COLUMN_NAME IN ('EntityId', 'EntityType')) BEGIN BEGIN TRANSACTION --Delete notes where EntityType and EntityID are both NULL DELETE FROM [dbo].[Notes] WHERE [EntityId] = NULL AND [EntityType] = NULL --Delete notes where the corresponding contact or account has been deleted. OR [ID] IN (9788, 10684, 10393, 10718, 10719) --Populate new columns with all existing data UPDATE [dbo].[Notes] SET [AccountId] = [EntityId] WHERE [EntityType] = 1 UPDATE [dbo].[Notes] SET [ContactId] = [EntityId] WHERE [EntityType] = 2 --Delete EntityId and EntityType columns from the Notes table ALTER TABLE [dbo].[Notes] DROP COLUMN [EntityId], [EntityType] COMMIT END GO 

Скрипт для таблицы

 CREATE TABLE [dbo].[Notes]( [ID] [int] IDENTITY(1,1) NOT NULL, [AnnotationID] [uniqueidentifier] NULL, [CreatedBy] [int] NULL, [CreatedDate] [datetime] NULL, [NoteText] [ntext] NULL, [OriginalAnnotationID] [uniqueidentifier] NULL, [Active] [bit] NULL, [ContactId] [int] NULL, [AccountId] [int] NULL, CONSTRAINT [PK_Notes] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[Notes] WITH CHECK ADD CONSTRAINT [FK_Account_ID] FOREIGN KEY([AccountId]) REFERENCES [dbo].[Account] ([ID]) GO ALTER TABLE [dbo].[Notes] CHECK CONSTRAINT [FK_Account_ID] GO ALTER TABLE [dbo].[Notes] WITH CHECK ADD CONSTRAINT [FK_ContactId_ID] FOREIGN KEY([ContactId]) REFERENCES [dbo].[Contact] ([ID]) GO ALTER TABLE [dbo].[Notes] CHECK CONSTRAINT [FK_ContactId_ID] GO 

Ошибки:

 Msg 207, Level 16, State 1, Line 6 Invalid column name 'EntityId'. Msg 207, Level 16, State 1, Line 7 Invalid column name 'EntityType'. Msg 207, Level 16, State 1, Line 12 Invalid column name 'EntityType'. Msg 207, Level 16, State 1, Line 16 Invalid column name 'EntityType'. 

Мартин был определенно на что-то. Материал внутри IF обрабатывается синтаксическим анализатором во время разбора и игнорирует, будет ли ваш IF разворачиваться. Это по той же причине, которую вы не можете сделать:

 IF 1 = 1 CREATE TABLE #x(a INT); ELSE CREATE TABLE #x(b INT); 

Одним из способов было бы использование динамического SQL:

 IF EXISTS ... BEGIN BEGIN TRANSACTION; DECLARE @sql NVARCHAR(MAX); SET @sql = N' DELETE FROM [dbo].[Notes] WHERE [EntityId] IS NULL AND [EntityType] IS NULL --Delete notes where the corresponding contact or account has been deleted. OR [ID] IN (9788, 10684, 10393, 10718, 10719) --Populate new columns with all existing data UPDATE [dbo].[Notes] SET [AccountId] = [EntityId] WHERE [EntityType] = 1 UPDATE [dbo].[Notes] SET [ContactId] = [EntityId] WHERE [EntityType] = 2 --Delete EntityId and EntityType columns from the Notes table ALTER TABLE [dbo].[Notes] DROP COLUMN [EntityId], [EntityType]'; EXEC sp_executesql @sql; COMMIT TRANSACTION; END 

Но вы все равно должны быть уверены, что оба столбца есть.

Я подозреваю, что проблема заключается в том, что один из столбцов существует, но не тот и другой. Попробуйте следующее:

 IF 2 = (SELECT count(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Notes' AND COLUMN_NAME IN ('EntityId', 'EntityType'))