我很确定发生了什么,但想从我的同事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#中。
想法?意见?谢谢!
这不是一个讨论网站。这是一个问答网站。请参阅http://stackoverflow.com/faq#dontask – 2012-02-28 21:14:17
如果您从http://blog.stackoverflow.com/2011/07/its的角度重新编写此问题,此问题可能会“更好地保留” -ok-to-ask-and-answer-your-own-questions/ – sarnold 2012-02-29 01:29:39