2012-02-28 2 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. Я бы хотел, чтобы тело CREATE PROCEDURE должно было иметь как минимум 1 пар BEGIN и END - heck make {быть псевдонимом/синонимом для BEGIN и} псевдоним/синоним для END - и мы будем на один шаг ближе к повороту TSQL в C#.

Мысли? Мнения? Благодаря!

+0

Это не дискуссионный сайт. Это сайт вопросов и ответов. См. Http://stackoverflow.com/faq#dontask –

+0

Этот вопрос может быть «лучше, чтобы остаться», если вы перепишите его с точки зрения http://blog.stackoverflow.com/2011/07/its -ok-to-ask-and-answer-your-own-questions/ – sarnold

ответ

2

процедура падения является частью прока и прок не будет опускаться, пока вы не вызовете процедурный

Это будет создавать и удалять процедурное, обратите внимание на GO это партия терминатор, если вы этого не сделаете есть что заявление падение будет частью самого прок

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; 

процедурный объект будет создаваться, но не получает капли PED, пока вы не вызовете процедурный

EXEC ToBeDropped 

это не имеет ничего общего с НАЧАТЬ, но потому, что DROP PROC является частью самой процедуры и не начал выполняться, пока вы не вызовете его

при попытке xeecute процедурный объект снова

EXEC ToBeDropped 

вы получите следующее сообщение

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

Это довольно открытый вопрос, который скорее всего будет закрыт для неопределенности. Может быть, вы можете перепросить Meta Overflow?

Однако, прежде чем он закрывается, рассуждения, насколько я знаю, не из-за BEGIN и END. Это из-за GO. Процедура create ставит всю логику под ним, пока не попадет в конец файла или GO. Итак, это явное значение, которое вы ищете:

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

Этот вопрос будет закрыт градом downvotes на Meta. Meta - это вопросы о сети, отчеты об ошибках, предложения, поддержка пользователей. – sarnold

Смежные вопросы