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

Sky*_*kym 2 sql sql-server stored-procedures

我试图了解SQL中发生的具体情况,这意味着不允许以下语法(我发现很难搜索):

IF (OBJECT_ID('..sp_cake', 'P') is not null)
  ALTER PROC sp_cake
  as 
  select 1
Run Code Online (Sandbox Code Playgroud)

我希望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
Run Code Online (Sandbox Code Playgroud)

这些例子将是我认为我正在做的最简单的表达(这些在语法上是正确的)

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
Run Code Online (Sandbox Code Playgroud)

我已经读过CREATE或ALTER必须是查询块中的第一个语句,但我不明白为什么.


我知道我可以解决这个问题:

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

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

Gor*_*off 7

我不确定你的意思是什么意思:

我已经读过CREATE或ALTER必须是查询块中的第一个语句,但我不明白为什么.

你是正确的,这些必须是批处理中的第一个语句.这是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;
Run Code Online (Sandbox Code Playgroud)

我确实同意拥有一个create procedure if not exists或更好create or alter procedure.获得该功能需要游说微软.

  • 好吧,原始/主要反馈项目消失了,但这里有其他人:http://connect.microsoft.com/SQLServer/feedback/details/351217/create-or-replace-xxx,http://connect.microsoft. com/SQLServer/feedback/details/344991/create-or-alter-statement,https://connect.microsoft.com/SQLServer/feedback/details/448946/create-or-alter-procedure (2认同)