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
我希望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是无效的.
我不确定你的意思是什么意思:
我已经读过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;
我确实同意拥有一个create procedure if not exists或更好create or alter procedure.获得该功能需要游说微软.