SQL Server/SQL Server Tip

SQL Server Four Part Name 정의 및 PARSERNAME을 활용하여 IP 대역 구하기

SungWookKang 2025. 1. 2. 22:30
반응형

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대역 구하기

반응형