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
否则,将返回存储的进程和返回
你想干什么?如果要停止重复条目,请参见以下答案:
在您的情况下,一个简单的
不存在
,或者一个其他的
就可以了。最终得到了一个解决方案。似乎比解决办法好
设置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