我试图了解SQL中发生的具体情况,这意味着不允许使用以下语法(我发现很难搜索):
IF (OBJECT_ID('..sp_cake', 'P') is not null)
ALTER PROC sp_cake
as
select 1
我希望ALTER有效,因为T-SQL将它包装在自己的BEGIN-END块中,并且脚本块的其余部分不会发生任何不良。
这就是T-SQL正在做的事情,包装所有内容并保持干净分离:
IF (OBJECT_ID('..sp_cake', 'P') is not null)
BEGIN
ALTER PROC [dbo].[sp_cake]
as
BEGIN
select 1
END
END
这些例子将是我认为我正在做的最简单的表达(这些在语法上是正确的)
IF (OBJECT_ID('..sp_cake', 'P') is not null)
select 1
IF (OBJECT_ID('..sp_cake', 'P') is null)
select 1 -- i.e. this works and 1 is the output
我已经读过CREATE或ALTER必须是查询块中的第一个语句,但我不明白为什么。
我知道我可以通过以下方式解决这个问题:
但是我不明白为什么测试存在然后ALTER是无效的。
答案 0 :(得分:7)
我不确定你的意思是什么意思:
我已经读过CREATE或ALTER必须是a中的第一个语句 查询块,但我不明白为什么。
你是正确的,这些必须是批处理中的第一个语句。这是T-SQL语言的一个属性 - 不是需要理解其原因的东西,而是需要知道正确使用该语言的东西。通常,在SQL Server中执行所需的结构是:
IF (OBJECT_ID('..sp_cake', 'P') is not null)
BEGIN
DROP PROCEDURE dbo.sp_code
END;
GO
CREATE PROC [dbo].[sp_cake] as
BEGIN
select 1
END;
我同意拥有create procedure if not exists
或create or alter procedure
会很高兴。获得该功能需要游说微软。