SQL Server Four Part Name 정의 및 PARSERNAME을 활용하여 IP 대역 구하기
l Version : SQL Server 2008 later
SQL Server를 운영하다 보면 Four Part Name 또는 Three Part Name이라는 용어를 접하게 된다. 이러한 용어는 데이터베이스 시스템에서 여러 데이터베이스 간에 개체(테이블, 뷰)를 참조하는데 사용되는 명명 규칙을 의미한다.
l Three-Part Name : 데이터베이스 이름, 스키마, 개체 이름을 포함
ü 예: DatabaseName.dbo.Employee)
l Four-Part Name : 서버 이름을 포함하여 Three-Part Name부분을 확장
ü 예: ServerName.DatabaseName.dbo.Employee)
이렇게 Three-Part 또는 Four-Part를 사용하면 동일한 서버내의 여러 데이터베이스 또는 다른 서버에서 데이터를 쿼리 할 수 있다.
그렇다면 이렇게 구성되어 있는 Four-Part Name에서 특정 Part의 정보만 추출하려면 어떻게 해야 할까? 이럴 때 사용할 수 있는 함수가 PARSENAME이다.
PARSENAME은 Four-Part Name 이름에서 지정된 부분을 반환한다. 검색 가능한 개체의 부분은 서버 이름, 데이터베이스 이름, 스키마 이름, 테이블 이름이다. 함수에 사용되는 매개변수는 선택적으로 정규화된 개체 이름이다.
Value | Description |
1 | Object Name |
2 | Schema Name |
3 | Database Name |
4 | Server Name |
참고로 Four-Part Name의 문자열은 총 길이 256 바이트를 넘을 수 없으며 256 바이트를 초과한 경우 유효한 sysname이 아니므로 NULL이 반환된다.
그러면 이제 PARSENAME를 어떻게 사용하는지 살펴보자. 아래와 같은 Four-Part Name이 있을 때, 매개변수에 따라 각 파트의 값이 반환된다.
DBServer.AdventureWorks2022.Person.Person |
-- Uses AdventureWorks SELECT PARSENAME('DBServer.AdventureWorks2022.Person.Person', 1) AS 'Object Name'; SELECT PARSENAME('DBServer.AdventureWorks2022.Person.Person', 2) AS 'Schema Name'; SELECT PARSENAME('DBServer.AdventureWorks2022.Person.Person', 3) AS 'Database Name'; SELECT PARSENAME('DBServer.AdventureWorks2022.Person.Person', 4) AS 'Server Name'; GO |
그렇다면 Three-Part Name의 경우는 어떻게 결과 값이 반환될까? 서버 이름을 제외하고 함수를 실행해 본다.
-- Uses AdventureWorks SELECT PARSENAME('AdventureWorks2022.Person.Person', 1) AS 'Object Name'; SELECT PARSENAME('AdventureWorks2022.Person.Person', 2) AS 'Schema Name'; SELECT PARSENAME('AdventureWorks2022.Person.Person', 3) AS 'Database Name'; SELECT PARSENAME('AdventureWorks2022.Person.Person', 4) AS 'Server Name'; GO |
마지막 서버이름의 반환 값이 NULL인 것을 확인할 수 있다. PARSENAME의 경우 뒤에서부터 하나씩 값을 읽기 때문에, 중간에 다른 이름을 삭제하더라도, 순차적으로 읽어 파싱하기 때문에 자릿수가 부족할 경우 그 자리는NULL 값으로 대체한다. 그렇기 때문에 무조건 서버이름이 NULL을 반환한다고 볼 수는 없지만, 정규화된 이름의 경우 항상 그 규칙이 있기 때문에 준수해서 사용하면 엉뚱한 값을 얻을 일은 없다.
그럼 이제 PARSENAME을 활용해서 IP의 대역을 파싱 하는 작업을 진행해보자. IP의 경우에도 Four -Part Name으로 이루어져 있으며, 각 파트는 점(.)으로 구분한다. 그렇기 때문에 IP를 파싱하는 용도는 아니지만 유사한 구조를 활용하여, 쉽게 파싱해서 사용할 수 있다.
SELECT PARSENAME('192.168.0.1', 1) AS 'D Class'; SELECT PARSENAME('192.168.0.1', 2) AS 'C Class'; SELECT PARSENAME('192.168.0.1', 3) AS 'B Class'; SELECT PARSENAME('192.168.0.1', 4) AS 'A Class'; GO |
PARSENAME으로 활용할 수 있는 부분은 IP외에도, 파싱 규칙이 점(.)으로 구분하기 때문에 Four-Part로 표현된 데이터라면 구분자를 점(.)으로 치환한다음 사용할 수 있다.
SELECT PARSENAME(REPLACE('A-B-C-D', '-', '.'), 1) AS 'D Class'; SELECT PARSENAME(REPLACE('A-B-C-D', '-', '.'), 2) AS 'C Class'; SELECT PARSENAME(REPLACE('A-B-C-D', '-', '.'), 3) AS 'B Class'; SELECT PARSENAME(REPLACE('A-B-C-D', '-', '.'), 4) AS 'A Class'; |
다양한 포맷의 데이터를 파싱 하려면 CHARINDEX 등을 활용하여 특정 문자열까지 자르고, 이후 자릿수를 계산해서 구하는 등 여러 함수를 조합하여 사용할 수 있지만, Four-Part 형식의 데이터라면 PARSENAME를 활용할 수 있다.
l 다양한 포맷의 이름 파싱 하기 : https://sungwookkang.com/entry/%EB%8B%A4%EC%96%91%ED%95%9C-%ED%8F%AC%EB%A7%B7%EC%9D%98-%EC%9D%B4%EB%A6%84-%ED%8C%8C%EC%8B%B1-%ED%95%98%EA%B8%B0
[참고자료]
l Transact-SQL syntax conventions : https://learn.microsoft.com/en-us/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql
l PARSENAME : https://learn.microsoft.com/en-us/sql/t-sql/functions/parsename-transact-sql
2025-01-02/ Sungwook Kang / http://sungwookkang.com
SQL Server, MS SQL, Four-Part Name, Three-Part Name, PARSENAME, FQDN, 포파트네임, 쓰리파트 네임, 파스네임, IP대역 구하기
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server Failover Cluster 구성 (0) | 2023.07.16 |
---|---|
SQL Server DELAYED_DURABILITY 옵션으로 트랜잭션 로그 쓰기 성능 개선 하기 (1) | 2022.10.31 |
SQL Server 에서 AWS S3에 직접 백업하기 (2) | 2022.10.28 |
VM 환경의 SQL Server에서 할당된 CPU를 모두 사용하지 못하는 현상 (0) | 2020.03.04 |
SQL Server 복원 성능 최적화 (0) | 2020.02.29 |