Tsql T-SQL:停止处理查询的其余部分

Tsql T-SQL:停止处理查询的其余部分,tsql,Tsql,我想知道是否可以在特定条件下停止处理查询的其余部分 场景 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]'

我想知道是否可以在特定条件下停止处理查询的其余部分

场景

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”后面的一行被视为新查询。我们每天都发布更新,希望安装更新更简单

我正在搜索类似“RETURN”语句的内容。它是有效的,但不适用于“GO”s

解决方法

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

我想要的是停止其余行的执行,相当于VisualBasic中的“RETURN/END”关键字。请帮忙

对于单个语句:

INSERT [dbo].[Updates]
    (RevisionNumber,...) 
SELECT 
    '12.2457.2', ...
WHERE
    NOT EXISTS (SELECT  *
    FROM
        [dbo].[Updates] 
   WHERE 
        RevisionNumber='12.2457.2')
对于多个语句:

IF NOT EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN

  --do stuff

END
否则,将返回存储的进程和返回

你想干什么?如果要停止重复条目,请参见以下答案:


您必须有条件地使用假想关键字才能使其具有任何值,此时您可以围绕该条件重构代码,也就是说,在任何情况下都不需要假想的STOP关键字


在您的情况下,一个简单的
不存在
,或者一个
其他的
就可以了。

最终得到了一个解决方案。似乎比解决办法好

设置noexec off/on就可以了

IF EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN
    PRINT 'The update ''12.2457.2'' was already installed.'
    set noexec on
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

set noexec off

我想我没有说得那么清楚。好吧,让我们从头开始。1.检查更新表。如果在表中找到更新信息,则不要运行查询的其余部分。2.运行T-SQL更新。3.在更新表中插入更新信息。@Nick Binnet:我认为您关注的是代码流,而不是实际要做的事情。它是否像“如果不存在,则仅插入”那样简单?
IF EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN
    PRINT 'The update ''12.2457.2'' was already installed.'
    set noexec on
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

set noexec off