Интересно, смогу ли я прекратить обработку остальной части запроса при определенном условии.
Сценарий
IF NOT EXISTS (SELECT *
FROM
[dbo].[Updates]
WHERE
RevisionNumber='12.2457.2')
BEGIN
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TestProcedure]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
PRINT 'Test';
END
GO
INSERT [dbo].[Updates]
SELECT '12.2457.2'
END
Приведенный выше запрос не будет работать, поскольку строка, следующая за «GO», обрабатывается как новый запрос. Мы выпускаем обновления каждый день и хотим простоты установки обновлений.
Я ищу что-то вроде заявления "ВОЗВРАТ". Это работает, но не с "GO".
IF EXISTS (SELECT *
FROM
[dbo].[Updates]
WHERE
RevisionNumber='12.2457.2')
BEGIN
PRINT 'The update ''12.2457.2'' was already installed.'
RETURN
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TestProcedure]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
PRINT 'Test';
END
GO
INSERT [dbo].[Updates]
SELECT '12.2457.2'
GO
Обход
BEGIN TRANSACTION
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestProcedure]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[TestProcedure]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
PRINT 'Test';
END
GO
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Updates] WHERE RevisionNumber='12.2457.2')
BEGIN
ROLLBACK TRANSACTION
PRINT 'The update was already present in the database. The transaction was rolled back.'
END
ELSE
BEGIN
INSERT [dbo].[Updates]
SELECT '12.2457.2'
COMMIT TRANSACTION
PRINT 'The update was sucessfully installed.'
END
Мне нужна идея остановить выполнение остальных строк, эквивалентное ключевому слову «RETURN / END» в Visual Basic. Пожалуйста, помогите!