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必须是查询块中的第一个语句,但我不明白为什么.
我知道我可以解决这个问题:
但我不明白为什么测试存在然后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;
Run Code Online (Sandbox Code Playgroud)
我确实同意拥有一个create procedure if not exists或更好create or alter procedure.获得该功能需要游说微软.
| 归档时间: |
|
| 查看次数: |
4417 次 |
| 最近记录: |