T-SQL 핵심 문법 — SQL Server 전용 확장 완전 가이드
T-SQL의 배치 처리(GO), TOP/PERCENT, IDENTITY, 식별자 대괄호, N 접두사, 4부분 이름, 시스템 함수, 표준 SQL과의 차이점을 설명합니다.
지난 글에서 SQL Server 파일 구조를 살펴봤다. 이번 글부터는 T-SQL(Transact-SQL) 문법 시리즈를 시작한다. T-SQL은 ANSI SQL 표준을 기반으로 Microsoft가 SQL Server를 위해 확장한 방언이다. 표준 SQL과 다른 T-SQL만의 특징을 이해해야 올바르고 효율적인 쿼리를 작성할 수 있다.
배치(Batch)와 GO
T-SQL에서 **배치(Batch)**는 한 번에 서버로 전송되고 파싱되는 SQL 문의 집합이다. GO는 배치의 경계를 나타내는 클라이언트 도구(SSMS, sqlcmd)의 지시어로, SQL Server 엔진이 직접 처리하지 않는다.
-- 배치 1
CREATE TABLE Products (
ProductID INT IDENTITY(1,1) PRIMARY KEY,
ProductName NVARCHAR(100) NOT NULL,
Price DECIMAL(10,2)
);
GO
-- 배치 2 (Products 테이블이 배치 1에서 생성된 후에 실행)
INSERT INTO Products (ProductName, Price)
VALUES (N'노트북', 1299.99), (N'마우스', 29.99);
GO
-- GO 뒤에 숫자: 배치를 N번 반복 실행 (테스트용)
PRINT N'Hello T-SQL';
GO 3
GO 없이 CREATE TABLE과 해당 테이블에 대한 INSERT를 같은 배치로 보내면 파서가 테이블이 없다고 에러를 낸다.
TOP과 PERCENT
T-SQL의 TOP은 ANSI SQL의 FETCH FIRST에 해당한다. 쿼리 결과의 앞부분을 잘라낸다.
-- 상위 10개
SELECT TOP 10 ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC;
-- 전체의 5% (PERCENT)
SELECT TOP 5 PERCENT *
FROM Employees
ORDER BY HireDate;
-- WITH TIES: 동점자 포함
SELECT TOP 3 WITH TIES
OrderID, CustomerID, Amount
FROM Orders
ORDER BY Amount DESC;
-- Amount 3위와 같은 값을 가진 행도 함께 반환
-- ORDER BY 없이 TOP: 순서 보장 안 됨 (주의!)
SELECT TOP 10 * FROM Products; -- 임의 10개
IDENTITY와 식별자
IDENTITY(seed, increment)는 자동 증가 정수 컬럼을 생성한다.
-- IDENTITY 컬럼 생성
CREATE TABLE Orders (
OrderID INT IDENTITY(1, 1) PRIMARY KEY, -- 1부터 1씩 증가
CustomerID INT NOT NULL,
OrderDate datetime2(0) NOT NULL DEFAULT GETDATE()
);
-- 마지막 IDENTITY 값 조회 (스코프 한정)
SELECT SCOPE_IDENTITY(); -- 현재 배치·SP 범위 내 마지막 IDENTITY
SELECT @@IDENTITY; -- 현재 세션 마지막 IDENTITY (트리거 포함)
SELECT IDENT_CURRENT('Orders'); -- 테이블 기준 마지막 IDENTITY (세션 무관)
-- IDENTITY 값 수동 삽입 (일시적 허용)
SET IDENTITY_INSERT Orders ON;
INSERT INTO Orders (OrderID, CustomerID) VALUES (1000, 42);
SET IDENTITY_INSERT Orders OFF;
-- IDENTITY 시드 재설정
DBCC CHECKIDENT('Orders', RESEED, 100); -- 다음 값이 101부터 시작
식별자 인용부호
T-SQL에서 예약어나 공백이 포함된 식별자는 대괄호 [] 또는 **쌍따옴표 ""**로 감싼다.
-- 대괄호: T-SQL 전용 (권장)
SELECT [Order ID], [From], [Customer Name]
FROM dbo.[Order Details];
-- 쌍따옴표: ANSI_QUOTES 설정 시 사용 가능
-- (기본값은 문자열 리터럴로 처리됨)
SET QUOTED_IDENTIFIER ON; -- 기본 ON
SELECT "Order ID" FROM "Order Details";
유니코드 문자열 — N 접두사
nchar, nvarchar에 한글, 일본어, 중국어 등 유니코드 문자를 입력하려면 문자열 앞에 N 접두사를 붙여야 한다.
-- N 없이 삽입하면 한글이 깨질 수 있음
INSERT INTO Customers (Name) VALUES ('홍길동'); -- 위험
INSERT INTO Customers (Name) VALUES (N'홍길동'); -- 안전
-- varchar vs nvarchar
DECLARE @v1 VARCHAR(10) = '홍길동'; -- 각 한글 2~3바이트
DECLARE @v2 NVARCHAR(10) = N'홍길동'; -- 각 한글 2바이트(UTF-16)
SELECT LEN(@v1), LEN(@v2), DATALENGTH(@v1), DATALENGTH(@v2);
-- LEN: 3, 3 / DATALENGTH: 6, 6 (환경에 따라 다를 수 있음)
4부분 이름
SQL Server는 서버.데이터베이스.스키마.오브젝트 형식으로 다른 서버의 객체를 직접 참조할 수 있다.
-- 2부분: 스키마.오브젝트 (같은 DB 내)
SELECT * FROM dbo.Customers;
SELECT * FROM Sales.Orders;
-- 3부분: 데이터베이스.스키마.오브젝트
SELECT * FROM AdventureWorks.dbo.Customers;
SELECT * FROM [ReportDB].dbo.ReportTable;
-- 4부분: 연결된 서버 (Linked Server) 참조
SELECT * FROM [DataWarehouse].[SalesDB].[dbo].[Customers];
자주 쓰는 시스템 함수
-- 메타 정보
SELECT DB_NAME(); -- 현재 데이터베이스 이름
SELECT SCHEMA_NAME(); -- 현재 기본 스키마
SELECT USER_NAME(); -- 현재 사용자
SELECT SUSER_NAME(); -- SQL Server 로그인 이름
SELECT @@SERVERNAME; -- 서버 인스턴스 이름
SELECT @@ROWCOUNT; -- 직전 DML 영향 행 수
-- 날짜 함수
SELECT GETDATE(); -- datetime (밀리초 정밀도)
SELECT SYSDATETIME(); -- datetime2(7) (100ns 정밀도)
SELECT GETUTCDATE(); -- UTC datetime
SELECT DATEADD(DAY, 7, GETDATE());
SELECT DATEDIFF(DAY, '2024-01-01', GETDATE());
SELECT DATEPART(WEEKDAY, GETDATE());
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd', 'ko-KR');
-- 문자열 함수
SELECT LEN(N'hello'); -- 5 (문자 수)
SELECT DATALENGTH(N'hello'); -- 10 (바이트 수)
SELECT CHARINDEX('l', 'hello'); -- 3
SELECT STUFF('hello', 2, 3, 'XYZ'); -- hXYZo
SELECT STRING_AGG(name, ', ') -- 그룹 내 문자열 집계 (SQL Server 2017+)
FROM Employees GROUP BY department;
SET 옵션
T-SQL 세션 동작을 제어하는 주요 SET 옵션이다.
SET NOCOUNT ON; -- 영향 행 수 메시지 숨김 (SP 내부 권장)
SET XACT_ABORT ON; -- 런타임 오류 시 자동 ROLLBACK
SET ANSI_NULLS ON; -- NULL = NULL → FALSE (ANSI 표준)
SET QUOTED_IDENTIFIER ON; -- 큰따옴표를 식별자로 처리
SET ARITHABORT ON; -- 산술 오버플로·0 나눗셈 오류 발생
-- 현재 SET 옵션 확인
SELECT SESSIONPROPERTY('QUOTED_IDENTIFIER'),
SESSIONPROPERTY('ANSI_NULLS');
다음 글에서는 T-SQL의 변수 선언, 조건문, 반복문, TRY…CATCH 오류 처리를 살펴본다.
지난 글: SQL Server 데이터 파일·로그 파일·파일 그룹
다음 글: T-SQL 변수·제어흐름·TRY…CATCH
읽어주셔서 감사합니다. 😊