2012-02-28 2 views
-2

나는 무엇이 진행되고 있는지 잘 알고 있지만, 동료 SQL Server Traveler로부터 아이디어를 얻고 싶었습니다. (실제로 어떤 일이 일어나고 있는지는 분명하지만 흥미로운 토론을하게 만듭니다.)BEGIN 및 END가 누락 되었습니까?

이 배트맨을 수수께끼로 여깁니다. 이것으로 무엇이 일어나나요?

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

어떻게됩니까? 내 첫 번째 생각은 절차가 생성 된 후 즉시 삭제 된 것입니다. Wrongo! 그리고 이전에 문제에 대해 이미 알지 못했다면 아마 같은 생각을했습니다 ... 인정하십시오!

SSMS에서 조회 결과를 텍스트로 전환하려면 Ctrl-T를 누르십시오. 그런 다음 다음을 실행 (또는 스크립트 새로운 절차 ToBeDropped 수) :

EXECUTE ToBeDropped; 

다시 실행 스크립트에 위의 sys.sql_modules 쿼리 또는 시도 개체 :

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'; 

다음 절차를 실행합니다. 더 이상 존재하지 않기 때문에 그럴 수 없습니다.

흠 ... 여기 무슨 일 이니? 분명히 암시가 시작하고 잠시 절차에 END가, 다음과 같은 : 내가 암시 적 행동의 큰 팬이 아니다

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은 더 많이 "진짜"가되는 방향으로 이동하고 있습니다. TSQL에서 현재 사용 가능하거나 잠재적으로 사용할 수있는 세미콜론 및 모든 CLR 기능을 참조하십시오. 적어도 하나의 BEGIN과 END 쌍을 가져야한다는 CREATE PROCEDURE 본문을보고 싶습니다. BEGIN의 별칭/동의어이며 END의 별칭/동의어입니다. 우리는 TSQL을 선회하는 데 한 걸음 더 다가 섰습니다. C#.

생각하십니까? 의견? 감사!

+0

이것은 토론의 장소가 아닙니다. 이것은 Q & A 사이트입니다. http://stackoverflow.com/faq#dontask –

+0

을 참조하십시오. http://blog.stackoverflow.com/2011/07/its의 관점에서이 질문을 다시 작성하면이 질문에 "충분히 만족할 수 있습니다"라고 표시 될 수 있습니다. -ok-to-ask-and-answer-your-questions-questions/ – sarnold

답변

2

드롭 절차는 시저의 일부이며, 당신은 시저를 호출 할 때까지 시저가 삭제되지 않습니다

이 작성하고 당신이하지 않으면,이 배치 종료되는 GO 통지, proc 디렉토리를 삭제합니다 드롭 문은 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 당신은 시저를 호출 할 때까지

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에서 다시 물어볼 수 있을까요?

그러나 종료되기 전에 내가 아는 한 추론은 시작과 끝 때문에가 아닙니다. 그것은 GO 때문입니다. 작성 프로시 저는 파일 또는 GO의 끝에 도달 할 때까지 모든 논리를 그 아래에 놓습니다. 그래서, 이것은 당신이 찾고있는 명시적인 가치입니다 :

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

이 질문은 Meta에 대한 downvotes의 우박에서 닫힐 것입니다. 메타는 네트워크, 버그 보고서, 제안, 사용자 지원에 대한 질문입니다. – sarnold

관련 문제