2012-02-28 84 views
-2

我很确定发生了什么,但想从我的同事SQL Server Travelers中得到一些想法(实际上很明显发生了什么,但我认为这是一个有趣的讨论)。缺少BEGIN和END?

谜语我这个蝙蝠侠...这是怎么回事?

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

会发生什么?我的第一个想法是程序被创建,然后立即下降。 Wrongo!你可能也想过,除非你已经知道这件事从以前的事情承认它!

在SSMS中按Ctrl-T将查询结果切换为文本。然后运行下面(或者你可以脚本的新程序ToBeDropped):

SELECT m.[definition] 
FROM sys.sql_modules AS m INNER JOIN sys.objects AS obj 
ON m.object_id = obj.object_id 
WHERE obj.name = 'ToBeDropped'; 

下运行的程序:

EXECUTE ToBeDropped; 

的重演上述sys.sql_modules查询或试图脚本的对象。你不能,因为它不再存在。

嗯......这是怎么回事?很明显,有一个隐含的开始和结束的,而过程中,类似以下内容:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 
END; 

进行格式化的更好的长相时,像下面这样:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    BEGIN 
     PRINT 'Drop me!'; 
    END 

    DROP PROCEDURE ToBeDropped; 
END ; 

我不是隐行为的忠实粉丝。我更喜欢明确。 TSQL正在朝着变得更加“真实”的方向发展 - 请参阅分号和现有的所有CLR功能,或者可能在TSQL中提供的所有CLR功能。我希望看到一个CREATE PROCEDURE主体必须至少有一个BEGIN和END对 - heck make {是BEGIN的别名/同义词,} END的别名/同义词 - 并且我们会更接近TSQL转向到C#中。

想法?意见?谢谢!

+0

这不是一个讨论网站。这是一个问答网站。请参阅http://stackoverflow.com/faq#dontask – 2012-02-28 21:14:17

+0

如果您从http://blog.stackoverflow.com/2011/07/its的角度重新编写此问题,此问题可能会“更好地保留” -ok-to-ask-and-answer-your-own-questions/ – sarnold 2012-02-29 01:29:39

回答

2

下降的过程是PROC的一部分和proc不会掉下来,直到调用PROC

这将创建和删除PROC,注意GO这是批处理终止,如果你不有drop语句将是PROC本身的一部分

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
GO 
DROP PROCEDURE ToBeDropped; 

,当你做到这一点

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

的PROC被创建,但没有得到降PED直到调用PROC

EXEC ToBeDropped 

这有没有关系开始,但因为DROP PROC是程序本身的一部分,并没有得到执行,直到你把它

当您尝试xeecute在PROC再次

EXEC ToBeDropped 

您会收到以下消息

Msg 2812, Level 16, State 62, Line 1 
Could not find stored procedure 'ToBeDropped'. 
0

这是一个相当开放的问题,很可能会因模糊而关闭。也许你可以重新问一下Meta Overflow?

但是,在它关闭之前,我所知道的推理并不是因为BEGIN和END。这是因为GO。创建过程将所有逻辑放在它下面,直到它到达文件或GO的末尾。所以,这是你正在寻找的明确的价值:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    PRINT 'Drop me!'; 
END 
--Completes the procedure creation 
GO 
DROP PROCEDURE ToBeDropped; 
+0

这个问题将会在Meta的降级会议上结束。元是关于网络的问题,错误报告,建议,用户支持。 – sarnold 2012-02-29 01:29:15

相关问题