gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:29:16 25 4
gpt4 key购买 nike

我试图了解 SQL 中具体发生了什么,这意味着不允许使用以下语法(而且我发现很难搜索):

IF (OBJECT_ID('..sp_cake', 'P') is not null)
ALTER PROC sp_cake
as
select 1

我希望 ALTER 有效,因为 T-SQL 将它包装在它自己的 BEGIN-END block 中,脚本 block 的其余部分不会发生任何坏事。

这就是 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 必须是查询 block 中的第一条语句,但我不明白为什么。


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

  • 创建一个虚拟存储过程,然后在 IF block 之外更改它,或者;
  • 创建整个存储过程的字符串并将其作为语句执行;

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

最佳答案

我不确定你所说的这句话是什么意思:

I have read that the CREATE or ALTER must be the first statement in a query block, but I don't understand why.

您是正确的,这些需要是批处理中的第一个语句。这是 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 会很好。获得该功能需要游说 Microsoft。

关于sql - TSQL 更改过程(如果存在)- 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23910294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com