TSQL更改过程(如果存在) - 语法错误

时间:2014-05-28 11:23:42

标签: sql sql-server stored-procedures

我试图了解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必须是查询块中的第一个语句,但我不明白为什么。


我知道我可以通过以下方式解决这个问题:

  • 创建一个虚拟的sproc,然后在IF块外面改变它,或者;
  • 创建整个sproc的字符串并将其作为语句执行;

但是我不明白为什么测试存在然后ALTER是无效的。

1 个答案:

答案 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 existscreate or alter procedure会很高兴。获得该功能需要游说微软。