웹에서 일부 코드와 SQL Server Management Studio에서 생성 한 스크립트를 확인하는 동안 일부 문이 세미콜론으로 끝나는 것을 알았습니다.
언제 사용해야합니까?
웹에서 일부 코드와 SQL Server Management Studio에서 생성 한 스크립트를 확인하는 동안 일부 문이 세미콜론으로 끝나는 것을 알았습니다.
언제 사용해야합니까?
답변:
Ken Powers 의 SQLServerCentral.Com 기사 에서 :
세미콜론
세미콜론 문자는 명령문 종결 자입니다. ANSI SQL-92 표준의 일부이지만 Transact-SQL에서는 사용되지 않았습니다. 실제로 세미콜론 없이도 수년 동안 T-SQL을 코딩 할 수있었습니다.
용법
세미콜론을 사용해야하는 두 가지 상황이 있습니다. 첫 번째 상황은 CTE (Common Table Expression)를 사용하는 곳이며 CTE는 배치의 첫 번째 문이 아닙니다. 두 번째는 Service Broker 문을 발행하는 지점이며 Service Broker 문은 배치의 첫 번째 문이 아닙니다.
THROW
서비스 브로커 문은? : 우리는이 예에서 던져 이전에 세미콜론을 포함 할 필요가BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
MERGE
예를 들어). 다른 답변에서 언급했듯이 ANSI 표준에서는 필수입니다
기본적으로 SQL 문은 세미콜론으로 종료됩니다. 새 문 종결자를 설정하지 않은 경우 세미콜론을 사용하여 문을 종료합니다.
하나의 명세서 만 보내면 기술적으로 명세서 종결자를 생략 할 수 있습니다. 스크립트에서 둘 이상의 문장을 보낼 때 필요합니다.
실제로 데이터베이스에 하나의 명령문을 보내는 경우에도 항상 종결자를 포함하십시오.
편집 : [특정 RDBMS]에는 명령문 종결자가 필요하지 않다는 말에 응답하여 사실 일 수도 있지만 ANSI SQL 표준에 필요합니다. 모든 프로그래밍에서 기능 손실없이 표준을 준수 할 수 있다면 코드 나 습관이 하나의 독점 공급 업체와 연결되어 있지 않기 때문입니다.
일부 C 컴파일러의 경우 표준에 main이 int를 반환해야하더라도 main return void가 가능합니다. 그러나 그렇게하면 코드와 이식성이 떨어집니다.
효과적인 프로그래밍의 가장 큰 어려움은 새로운 것을 배우는 것이 아니라 나쁜 습관을 배우지 않는 것입니다. 처음에는 나쁜 습관을 습득 할 수 없을 정도로 우리, 우리의 코드, 코드를 읽거나 사용하는 사람에게는 승리입니다.
SQL2008 BOL에서는 다음 릴리스에서는 세미콜론이 필요하다고 말합니다. 따라서 항상 사용하십시오.
참고:
당신은 해야한다 그것을 사용할 수 있습니다.
명령문을 종료하기 위해 세미콜론을 사용하는 방법은 표준이며 실제로 다른 여러 데이터베이스 플랫폼에서는 필수입니다. SQL Server에는 특정 경우에만 세미콜론이 필요하지만 세미콜론이 필요하지 않은 경우 세미콜론을 사용해도 문제가 발생하지 않습니다. 세미콜론으로 모든 명령문을 종료하는 방법을 채택하는 것이 좋습니다. 이렇게하면 코드의 가독성이 향상 될뿐만 아니라 슬픔을 덜 수 있습니다. 세미콜론이 필요하고 지정되지 않은 경우 SQL Server가 생성하는 오류 메시지가 항상 명확하지는 않습니다.
그리고 가장 중요한 :
SQL Server 설명서는 세미콜론으로 T-SQL 문을 종료하지 않는 것이 더 이상 사용되지 않는 기능임을 나타냅니다. 이는 장기적인 목표는 향후 버전의 제품에 세미콜론을 사용하는 것입니다. 그것이 현재 필요하지 않은 곳에서도 모든 진술을 끝내는 습관을들이는 또 하나의 이유입니다.
출처 : Itzik Ben-Gan의 Microsoft SQL Server 2012 T-SQL 기본 사항 .
항상 사용해야하는 이유의 예는 ;
다음 두 쿼리 (이 게시물 에서 복사 됨 )입니다.
BEGIN TRY
BEGIN TRAN
SELECT 1/0 AS CauseAnException
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
THROW
END CATCH
BEGIN TRY
BEGIN TRAN
SELECT 1/0 AS CauseAnException;
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE();
THROW
END CATCH
not using them
더 이상 사용되지 않는 기술이라고 발표되면 사용해야합니다. 그렇지 않으면 미래에 고통을 겪을 위험이 있습니다. 작업을 업그레이드 / 전환하지 않고 항상 SQL Server 2000으로 작업 할 계획이라면 안전합니다 :-)
Incorrect syntax near 'THROW'.
SQL Server 2008 (10.0.6241.0)을 생성하며, 이는 직장에서 처리해야하는 버전입니다. 사용 중단으로 인해 세미콜론을 사용하기 시작했습니다. 나는 그것이 2008 년에 대부분 문제가 될 것으로 예상하지 않는다.
이것을 올바르게 읽으면 세미콜론을 사용하여 TSQL 문을 끝내야합니다. http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx
편집 : 스크립트를 포맷하고 세미콜론을 추가하는 SSMS 2008R2 용 플러그인을 발견했습니다. 그래도 아직 베타 버전 인 것 같습니다 ...
http://www.tsqltidy.com/tsqltidySSMSAddin.aspx
편집 : ApexSQL이라는 훨씬 더 나은 무료 도구 / 플러그인을 찾았습니다 ... http://www.apexsql.com/
개인적인 의견 : 필요한 곳에만 사용하십시오. (필요한 목록은 위의 TheTXI의 답변을 참조하십시오.)
컴파일러를 필요로하지 않기 때문에, 당신은 할 수 있습니다 그것들을 모두 넣을 는 있지만 왜 그럴까요? 컴파일러는 어디를 잊었는지 알려주지 않으므로 일관되지 않은 사용으로 끝납니다.
[이 의견은 SQL Server에만 해당됩니다. 다른 데이터베이스에는보다 엄격한 요구 사항이있을 수 있습니다. 여러 데이터베이스에서 실행하기 위해 SQL을 작성하는 경우 요구 사항이 다를 수 있습니다.]
tpdi는 "스크립트에서 둘 이상의 문장을 보낼 때 필요하다"고 말했다. 실제로 정확하지 않습니다. 필요하지 않습니다.
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';
산출:
Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional
나는 여전히 T-SQL에 대해 배울 것이 많지만 트랜잭션에 대한 코드를 작성하고 (스택 오버 플로우 및 기타 사이트의 예제를 기반으로 한 코드) 세미콜론이 필요하고 누락 된 경우를 발견했습니다. 명령문이 전혀 실행되지 않고 오류가 발생하지 않습니다. 이것은 위의 답변에서 다루지 않은 것 같습니다. (MS SQL Server 2012를 사용하고있었습니다.)
거래가 내가 원하는 방식으로 작동하게 한 후에, 시도 캐치를 배치하기로 결정하여 오류가 있으면 롤백됩니다. 이 작업을 수행 한 후에 만 트랜잭션이 커밋되지 않았습니다 (SSMS는 커밋되지 않은 트랜잭션이 있다는 사실을 알려주는 좋은 메시지로 창을 닫으려고 할 때이를 확인합니다.
그래서 이거
COMMIT TRANSACTION
BEGIN TRY / END TRY 블록 외부에서는 트랜잭션을 커밋하는 데 문제가 없었지만 블록 내부에서는
COMMIT TRANSACTION;
오류나 경고가 제공되지 않으며 쿼리 탭을 닫을 때까지 트랜잭션이 아직 커밋되지 않았다는 표시가 없습니다.
다행히도 이것은 큰 문제를 일으켜 문제가 있음을 즉시 알 수 있습니다. 불행하게도 오류 (구문 또는 기타)가보고되지 않았기 때문에 문제가 무엇인지 즉시 알 수 없었습니다.
반대로 ROLLBACK TRANSACTION은 세미콜론이 있거나없는 BEGIN CATCH 블록에서 동일하게 작동하는 것 같습니다.
이것에 대한 논리가있을 수 있지만 임의의 원더 랜드 느낌을 느낍니다.
COMMIT TRANSACTION
는 선택적인 트랜잭션 / 저장 지점 이름 을 허용하기 때문입니다 (무시할 것임). 세미콜론을 종료하지 않으면 COMMIT TRANSACTION
코드의 의미를 근본적으로 변경할 수있는 식별자로 구문 분석 할 경우 다음 기호를 사용할 수 있습니다. 이로 인해 오류가 발생하면 CATCH
실행되지 않은 채 트리거 될 수 있습니다 COMMIT
. 반대로 ROLLBACK TRANSACTION
이와 같은 선택적 식별자도 허용 하지만 구문 분석시 오류가 발생하면 트랜잭션이 롤백 될 가능성이 높습니다.
: 세미콜론 커서 작업과 함께 사용되어서는 안된다는 표시 OPEN
, FETCH
, CLOSE
및DEALLOCATE
. 방금 이것으로 몇 시간을 낭비했습니다. 나는 BOL을 면밀히 살펴 보았고 [;]가이 커서 명령문의 구문에 표시되지 않음을 알았습니다 !!
그래서 나는 가지고 있었다 :
OPEN mycursor;
이로 인해 16916 오류가 발생했습니다.
그러나:
OPEN mycursor
일했다.
Transact-SQL 구문 규칙 (Transact-SQL) (MSDN) 에 따르면
Transact-SQL 문 종결 자 이 버전의 SQL Server에서는 대부분의 명령문에 세미콜론이 필요하지 않지만 향후 버전에서는 세미콜론이 필요합니다.
(또한 @gerryLowry의 의견 참조)
참고 :이 질문은 작성된대로 질문에 대답하지만 언급 된 문제에는 해당되지 않습니다. 사람들이 검색하므로 여기에 추가
세미콜론은 또한 WITH
재귀 CTE 문에서 사용됩니다 .
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
이 쿼리는 정수로 구성된 Numbers라는 CTE를 생성합니다 [1..10]. 값이 1 인 테이블 만 작성한 다음 10에 도달 할 때까지 반복합니다.
SQLServer에서 임의의 Command Timeout 오류가 발생하는 경우 CommandText 문자열 끝에서 세미콜론을 제거하십시오.
나는 이것이 어디서나 문서화되는지 또는 버그인지는 모르지만, 그것이 일어나고 나는 쓴 경험에서 이것을 배웠다.
SQLServer 2008을 사용하여 확인 가능하고 재현 가능한 예가 있습니다.
일명-> 실제로는 데이터베이스에 하나의 명령문을 보내는 경우에도 항상 종결자를 포함시킵니다.
세미콜론이 항상 복합 SELECT 문에서 작동하지는 않습니다.
이 두 가지 다른 버전의 간단한 복합 SELECT 문을 비교하십시오.
코드
DECLARE @Test varchar(35);
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.';);););
SELECT @Test Test;
보고
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
그러나 코드
DECLARE @Test varchar(35)
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.')))
SELECT @Test Test
보고
Test
-----------------------------------
Semicolons do not always work fine.
(1 row(s) affected)