SQL Server에서 세미콜론을 언제 사용해야 합니까?
웹에서 일부 코드와 SQL Server Management Studio에서 생성한 스크립트를 확인하는 동안 일부 문이 세미콜론으로 끝나는 것을 발견했습니다.
그럼 언제 사용하면 될까요?
SQL Server Central에서.켄 파워스의 논평:
세미콜론
세미콜론 문자는 문 종료 문자입니다.ANSI SQL-92 표준의 일부이지만 Transact-SQL에서는 사용되지 않았습니다.실제로 몇 년 동안 세미콜론을 경험하지 않고 T-SQL을 코딩하는 것이 가능했습니다.
사용.
세미콜론을 사용해야 하는 두 가지 상황이 있습니다.첫 번째 상황은 CTE(Common Table Expression)를 사용하는 경우이며, CTE는 배치의 첫 번째 문이 아닙니다.두 번째는 Service Broker 문을 발행하는 경우이며 Service Broker 문은 배치의 첫 번째 문이 아닙니다.
기본적으로 SQL 문은 세미콜론으로 끝납니다.새 문 종료자를 거의 설정하지 않은 경우 세미콜론을 사용하여 문을 종료합니다.
하나의 문만 보내는 경우, 기술적으로 문 종료자를 생략할 수 있습니다. 스크립트에서는 두 개 이상의 문을 보낼 때 필요합니다.
실제로 데이터베이스에 하나의 문만 보내는 경우에도 항상 종료자를 포함합니다.
편집: [특정 RDBMS]에서는 문 종결자가 필요하지 않다는 의견에 대응하여, ANSI SQL 표준에서는 이들이 필요합니다.모든 프로그래밍에서, 우리가 기능의 손실 없이 표준을 준수할 수 있다면, 우리는 그래야 합니다. 왜냐하면 우리의 코드나 습관은 하나의 독점 공급업체에 묶여 있지 않기 때문입니다.
일부 C 컴파일러의 경우 표준에서 int를 반환하려면 main이 필요하지만 main return void를 가질 수 있습니다.하지만 그렇게 하면 코드와 우리 자신의 휴대성이 떨어집니다.
효과적으로 프로그래밍하는 데 있어 가장 큰 어려움은 새로운 것을 배우는 것이 아니라 나쁜 습관을 배우지 않는 것입니다.우리가 나쁜 습관을 갖는 것을 피할 수 있는 한, 그것은 우리, 우리의 코드, 그리고 우리의 코드를 읽거나 사용하는 모든 사람들을 위한 승리입니다.
꼭 사용하셔야 합니다.
세미콜론을 사용하여 문을 종료하는 방법은 표준이며 실제로 다른 여러 데이터베이스 플랫폼에서는 필수 사항입니다. SQL Server는 특정한 경우에만 세미콜론을 필요로 하지만 세미콜론이 필요하지 않은 경우에는 세미콜론을 사용해도 문제가 발생하지 않습니다.모든 문을 세미콜론으로 끝내는 방법을 채택할 것을 강력히 권장합니다.이렇게 하면 코드의 가독성이 향상될 뿐만 아니라 어떤 경우에는 슬픔을 덜어줄 수 있습니다.세미콜론이 필요하고 지정되지 않은 경우 SQL Server에서 생성되는 오류 메시지가 항상 명확하지는 않습니다.
그리고 가장 중요한 것은:
SQL Server 설명서에는 T-SQL 문을 세미콜론으로 종료하지 않는 것이 더 이상 사용되지 않는 기능이라고 나와 있습니다.이는 제품의 향후 버전에서 세미콜론 사용을 강제하는 것이 장기적인 목표임을 의미합니다.그것이 현재 필요하지 않은 곳에서도 모든 진술을 종료하는 습관을 들여야 하는 또 다른 이유입니다.
출처: Itzik Ben-Gan의 Microsoft SQL Server 2012 T-SQL Fundamentals.
에를 항상 사용해야 에 대한 예;
다음 두 가지 쿼리(이 게시물에서 가져온 쿼리)입니다.
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
SQL 2008 BOL에서 다음 릴리스에서는 세미콜론이 필요하다고 합니다.따라서 항상 사용하십시오.
참조:
- Transact-SQL 구문 규칙(Transact-SQL)
- SQL Server 2008 R2에서 사용되지 않는 데이터베이스 엔진 기능("SQL Server의 향후 버전에서는 지원되지 않는 기능" 섹션, "Transact-SQL" 영역)
제가 이 글을 올바르게 읽는다면 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/
개인적인 의견:필요한 경우에만 사용하십시오.(필요한 목록은 위의 TXI 답변을 참조하십시오.)
컴파일러가 그것들을 필요로 하지 않기 때문에, 당신은 그것들을 모두 넣을 수 있습니다, 하지만 왜죠?컴파일러는 당신이 그것을 어디에 잊어버렸는지 말해주지 않을 것이고, 그래서 당신은 일관성 없는 사용을 하게 될 것입니다.
[이 의견은 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 TRI/END TRI 블록 외부에서는 트랜잭션을 커밋하는 데 문제가 없었지만 블록 내부에서는 트랜잭션을 커밋해야 했습니다.
COMMIT TRANSACTION;
제공된 오류나 경고가 없으며 쿼리 탭을 닫을 때까지 트랜잭션이 커밋되지 않았다는 표시가 없습니다.
다행히도 이것은 매우 큰 문제를 일으켜서 문제가 있다는 것이 즉시 명백합니다.안타깝게도 오류(구문 또는 기타)가 보고되지 않았기 때문에 문제가 무엇인지 즉시 명확하지 않았습니다.
반대로, 롤백 트랜잭션은 세미콜론이 있든 없든 BEGIN CATCH 블록에서 똑같이 잘 작동하는 것 같습니다.
이에 대한 논리가 있을 수 있지만 자의적이고 이상한 나라의 앨리스처럼 느껴집니다.
Transact-SQL 구문 규칙(Transact-SQL)(MSDN)에 따름
Transact-SQL 문 종료자입니다.이 버전의 SQL Server에서는 대부분의 문에 세미콜론이 필요하지 않지만 이후 버전에서는 세미콜론이 필요합니다.
(@geryLowry의 코멘트도 참조)
세미콜론은 커서 작업과 함께 사용하면 안 됩니다.OPEN
,FETCH
,CLOSE
그리고.DEALLOCATE
저는 이것으로 몇 시간을 낭비했습니다.BOL을 자세히 살펴보니 이러한 커서 문에 대한 구문에 [;]가 표시되어 있지 않습니다!!
그래서 나는:
OPEN mycursor;
그리고 이것은 나에게 오류 16916을 주었습니다.
그러나:
OPEN mycursor
일했다.
다른 문이 포함된 배치에서 DISABLE 또는 ENABLE 트리거 문을 사용하는 경우 직전의 문은 세미콜론으로 끝나야 합니다.그렇지 않으면 구문 오류가 발생합니다.이걸로 머리를 쥐어뜯었어요그리고 그 후에, 저는 같은 것에 대해 MS Connect 아이템을 발견했습니다.수리가 되지 않아 닫혀 있습니다.
여기 참조
SQL Server에서 임의 명령 시간 초과 오류가 발생하는 경우 명령 끝에 세미콜론을 사용하지 않도록 설정합니다.텍스트 문자열.
저는 이것이 어디에 기록되어 있는지 혹은 그것이 버그인지는 모르지만, 그것은 실제로 일어나고 저는 이것을 쓰라린 경험으로부터 배웠습니다.
SQL Server 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)
참고: 이렇게 하면 질문에 기록된 대로 답할 수 있지만, 언급된 대로 답할 수 있는 문제는 아닙니다.사람들이 검색할 것이기 때문에 여기에 추가합니다.
은 세콜론사용다니됩도다음에 앞에도 됩니다.WITH
재귀 CTE 문:
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
이 쿼리는 정수 [1...10]로 구성된 숫자라는 CTE를 생성합니다.값이 1인 테이블만 만든 다음 10이 될 때까지 반복하면 됩니다.
언급URL : https://stackoverflow.com/questions/710683/when-should-i-use-semicolons-in-sql-server
'programing' 카테고리의 다른 글
벡터에 따라 데이터 프레임 행 순서 지정 (0) | 2023.06.07 |
---|---|
해시로 커밋을 찾는 방법은 무엇입니까? (0) | 2023.06.07 |
명령 및 인수와 함께 python 하위 프로세스를 사용하는 동안 "OSError: [Errno 2] 해당 파일 또는 디렉터리 없음" (0) | 2023.06.07 |
구체적으로, 포크()는 리눅스에서 malloc()에서 동적으로 할당된 메모리를 어떻게 처리합니까? (0) | 2023.06.07 |
ggplot2 상자 그림에서 특이치 무시 (0) | 2023.06.07 |