DB 관련

[MSSql] 데이터 유형 hierarchyid 를 이용한 계층구조 테이블 생성 및 추가/...

DevReff 2024. 12. 27. 08:22




728x90
반응형

이 내용은 MS-SQL 2008 버전 이상에서 사용이 가능하다.

 

1. 데이터 유형 hierarchyid 이용한  계층구조 테이블 생성

CREATE TABLE TBB_CODE
(
 OrgNode hierarchyid PRIMARY KEY CLUSTERED,
 OrgLevel AS OrgNode.GetLevel(),
 [BASE_CD] [varchar](50) NOT NULL,
 [CD_GRP] [varchar](50) NULL,
 [CD_NAME] [varchar](255) NULL,
 [CD_ENAME] [varchar](255) NULL,
 [DVALUE] [decimal](38, 10) NULL,
 [SVALUE] [varchar](255) NULL,
 [DESC] [varchar](1024) NULL,
 [ORDER] [int] NULL,
 [YN] [char](1) NULL DEFAULT ('N'),
 [YN_DATE] [datetime] NULL,
 [REG_DATE] [datetime] NULL DEFAULT (getdate()),
 [CDATE] [datetime] NULL DEFAULT (getdate())
) ;

 

2. 데이터 추가 프로시져

/****** Object:  StoredProcedure [dbo].[SP_CODE_ADD]    Script Date: 2015-03-21 오후 12:08:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  jwcho
-- Create date: 2015.03.20
-- Modify date: 2015.03.20
-- Description: 기본코드 정보를 검색한다.
-- 주의사항: 소속그룹이 없이 기본코드 또는 명칭을 검색하면 이 프로시져를 사용하여 검색하는 것이 단순검색하는 것보다 많이 느리다.
-- SP_CODE_ADD '_ROOT_', 'BS0001', '재료분류','Material category',NULL,NULL,'재료 관련정보의 최상위 그룹'
-- SP_CODE_ADD 'BS0001', 'BS00010001', '공통(노임)',NULL,NULL,'','▣ 공통(노임)'
-- SP_CODE_ADD 'BS00010001', 'BS000100010001', '노임',NULL,NULL,'','★ 노임'
-- SP_CODE_ADD '_ROOT_', 'CONC', '콘크리트','CONCRETE',NULL,'','콘크리트 관련정보의 최상위 그룹'
-- SP_CODE_ADD 'CONC', 'CONC001', '콘크리트 강도 목록','CONCRETE STRENGTH',NULL,'','콘크리트 강도의 종류에 대한 목록'
-- SP_CODE_ADD 'CONC001', 'CONC001001', '콘크리트 강도 목록',NULL,NULL,NULL,NULL
-- SP_CODE_ADD 'AL001','AL001001','SLIDING',NULL,NULL,NULL,'__SLIDING'
-- SP_CODE_ADD 'BS000100360001','BS0001003600030014', '적재', NULL, NULL, NULL, '☞적재'
-- =============================================
ALTER PROCEDURE [dbo].[SP_CODE_ADD]
 @V_GROUP VARCHAR(50),  -- 소속그룹 ID
 @V_CODE VARCHAR(50),  -- 코드
 @V_KNAME VARCHAR(255)=NULL, -- 한글명칭
 @V_ENAME VARCHAR(255)=NULL, -- 영문명칭
 @V_DVALUE DECIMAL(38,10)=NULL, -- 숫자형 값
 @V_SVALUE VARCHAR(255)=NULL, -- 문자형 값
 @V_DESC VARCHAR(1024)=NULL -- 설명
AS
BEGIN
 SET NOCOUNT ON;

 --CREATE TABLE #RetTable
 --(
 -- [RetVal] INT     NULL
 -- ,[MSG] VARCHAR(1024) NULL
 -- ,[GROUP] VARCHAR(50) NULL
 -- ,[CODE] VARCHAR(50) NULL
 -- ,[KNAME] VARCHAR(50) NULL
 -- )

 IF @V_GROUP IS NULL OR LEN(@V_GROUP) < 1
  OR @V_CODE IS NULL OR LEN(@V_CODE) < 1
 BEGIN
  --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
  --VALUES (-1, '코드가 올바르지 않습니다.', @V_GROUP, @V_CODE, @V_KNAME);
  SELECT -1 'RetVal', '코드가 올바르지 않습니다.' 'MSG', @V_GROUP '[GROUP]', @V_CODE '[CODE]', @V_KNAME 'KNAME';
  RETURN
 END

 IF NOT EXISTS(SELECT BASE_CD FROM TBB_CODE WHERE BASE_CD='_ROOT_')
  INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
  VALUES (HIERARCHYID::GetRoot(), '_ROOT_', NULL, '_ROOT_','_ROOT_',NULL,'','_ROOT_') ;

 IF EXISTS(SELECT BASE_CD FROM TBB_CODE WHERE BASE_CD=@V_CODE)
 BEGIN TRY
  EXECUTE dbo.SP_CODE_DELETE @V_CODE, 0;
 END TRY
 BEGIN CATCH
  --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
  --VALUES (0, CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE(), @V_GROUP, @V_CODE, @V_KNAME);
  --SELECT 0 'RetVal', CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE() 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';
 END CATCH

 DECLARE @OrgNode HIERARCHYID;
 DECLARE @LAST_CHILD HIERARCHYID;

 SELECT @OrgNode = OrgNode
 FROM TBB_CODE
 WHERE [BASE_CD] = @V_GROUP;
 --print @V_GROUP + ',  ' + @V_CODE + '  ' + @OrgNode.ToString();

 IF @OrgNode IS NOT NULL AND LEN(@OrgNode.ToString()) > 0
 BEGIN
  SELECT @LAST_CHILD = MAX(OrgNode)
  FROM TBB_CODE
  WHERE OrgNode.GetAncestor(1) = @OrgNode;
  --print 'Last Child ID: ' + @LAST_CHILD.ToString();

  IF (@LAST_CHILD IS NOT NULL AND LEN(@LAST_CHILD.ToString()) > 0)
   AND (@V_GROUP <> '_ROOT_')
  BEGIN
   --print CHAR(3) + '하부 데이터 추가' + CHAR(3);
   DECLARE @LAST_CHILD2 HIERARCHYID;
   SELECT @LAST_CHILD2 = MAX(OrgNode)
   FROM TBB_CODE
   WHERE OrgNode.GetAncestor(1) = @LAST_CHILD;
   --print 'Last Child2 ID: ' + @LAST_CHILD2.ToString();
   BEGIN TRY
    INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
    VALUES (@LAST_CHILD.GetDescendant(@LAST_CHILD2, NULL), @V_CODE, @V_GROUP, @V_KNAME,@V_ENAME,@V_DVALUE,@V_SVALUE,@V_DESC);
   END TRY
   BEGIN CATCH
    --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
    --VALUES (0, CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE(), @V_GROUP, @V_CODE, @V_KNAME);
    SELECT 0 'RetVal', CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE() 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';
   END CATCH
  END
  ELSE
  BEGIN
   --print CHAR(3) + '상위 데이터 추가' + CHAR(3);
   IF (@LAST_CHILD IS NOT NULL AND LEN(@LAST_CHILD.ToString()) > 0)
   BEGIN
    BEGIN TRY
     INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
     VALUES (@OrgNode.GetDescendant(@LAST_CHILD, NULL), @V_CODE, @V_GROUP, @V_KNAME,@V_ENAME,@V_DVALUE,@V_SVALUE,@V_DESC);
    END TRY
    BEGIN CATCH
     --print 'ErrorNumber:'+convert(varchar,ERROR_NUMBER())+ 'ErrorMessage:'+ERROR_MESSAGE() + ',' + @V_GROUP + ',' + @V_CODE  + ',' + @V_KNAME + CHAR(13);
     --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
     --VALUES (0, CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE(), @V_GROUP, @V_CODE, @V_KNAME);
     SELECT 0 'RetVal', CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE() 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';
    END CATCH
   END
   ELSE
   BEGIN
    BEGIN TRY
     INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
     VALUES (@OrgNode.GetDescendant(NULL, NULL), @V_CODE, @V_GROUP, @V_KNAME,@V_ENAME,@V_DVALUE,@V_SVALUE,@V_DESC);
    END TRY
    BEGIN CATCH
     --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
     --VALUES (0, CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE(), @V_GROUP, @V_CODE, @V_KNAME);
     SELECT 0 'RetVal', CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE() 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';
    END CATCH
   END
  END
 END
 ELSE
 BEGIN
  DECLARE @NewGroup VARCHAR(50) = '_ROOT_'
  
  BEGIN TRY
   INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
   VALUES (HIERARCHYID::GetRoot(), @V_GROUP, @NewGroup, @V_KNAME,@V_ENAME,NULL,NULL,@V_GROUP);

   SELECT @OrgNode = OrgNode
   FROM TBB_CODE
   WHERE [BASE_CD] = @V_GROUP;

   INSERT TBB_CODE (OrgNode, [BASE_CD], [CD_GRP],[CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC])
   VALUES (@OrgNode.GetDescendant(NULL, NULL), @V_CODE, @V_GROUP, @V_KNAME,@V_ENAME,@V_DVALUE,@V_SVALUE,@V_DESC);
  END TRY
  BEGIN CATCH
   --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
   --VALUES (0, CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE(), @V_GROUP, @V_CODE, @V_KNAME);
   SELECT 0 'RetVal', CONVERT(VARCHAR,ERROR_NUMBER())+':'+ERROR_MESSAGE() 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';
  END CATCH
 END

 --INSERT #RetTable ([RetVal], [MSG], [GROUP], [CODE], [KNAME])
 --VALUES (1, '성공적으로 추가되었습니다.', @V_GROUP, @V_CODE, @V_KNAME);
 SELECT 1 'RetVal', '성공적으로 추가되었습니다.' 'Message', @V_GROUP '[GROUP]', @V_CODE 'CODE', @V_KNAME 'KNAME';

 --==============================================================================
 -- 기존 Code 를 신규 코드 테이블로 데이터를 복사하는 과정
 --DECLARE @V_GROUP VARCHAR(50),  -- 소속그룹 ID
 -- @V_CODE VARCHAR(50),  -- 코드
 -- @V_KNAME VARCHAR(255)=NULL, -- 한글명칭
 -- @V_ENAME VARCHAR(255)=NULL, -- 영문명칭
 -- @V_DVALUE DECIMAL(38,10)=NULL, -- 숫자형 값
 -- @V_SVALUE VARCHAR(255)=NULL, -- 문자형 값
 -- @V_DESC VARCHAR(1024)=NULL -- 설명

 --DECLARE CodeData CURSOR FOR
 -- SELECT [CD_GRP], [BASE_CD], [CD_NAME],[CD_ENAME],[DVALUE],[SVALUE],[DESC]
 -- FROM TB_SNP_CODE
 -- WHERE YN = 'N'
 -- ORDER BY CD_GRP, [ORDER];
 --OPEN CodeData;
 
 --FETCH NEXT FROM CodeData
 --INTO @V_GROUP, @V_CODE, @V_KNAME, @V_ENAME, @V_DVALUE, @V_SVALUE, @V_DESC;

 --WHILE (@@FETCH_STATUS = 0)
 --BEGIN
 -- --PRINT @V_GROUP + @V_CODE + @V_KNAME + @V_ENAME + CONVERT(VARCHAR,@V_DVALUE) + @V_SVALUE + @V_DESC + CHAR(13);
 -- BEGIN TRY
 --  IF NOT EXISTS (SELECT BASE_CD FROM TBB_CODE WHERE BASE_CD=@V_CODE)
 --  BEGIN
 --   PRINT '실행 SP_CODE_ADD()'+CHAR(13)
 --   EXECUTE dbo.SP_CODE_ADD @V_GROUP, @V_CODE, @V_KNAME, @V_ENAME, @V_DVALUE, @V_SVALUE, @V_DESC;
 --  END
 --  ELSE
 --   PRINT '데이터가 이미 있습니다.' + @V_GROUP + ',' + @V_CODE + ',' + @V_KNAME + CHAR(13)
 -- END TRY
 -- BEGIN CATCH
 --  PRINT '오류: ErrorNumber:' + convert(varchar,ERROR_NUMBER()) + ', ErrorMessage:' + ERROR_MESSAGE()
 --   + ',' + @V_GROUP + ',' + @V_CODE  + ',' + @V_KNAME;
 --  --SELECT '오류' CMD, ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage
 --  -- , @V_GROUP [GROUP], @V_CODE [CODE], @V_KNAME [KNAME], @V_ENAME [ENAME], @V_DVALUE [DVALUE], @V_SVALUE [SVALUE], @V_DESC [DESC];
 -- END CATCH

 -- FETCH NEXT FROM CodeData
 -- INTO @V_GROUP, @V_CODE, @V_KNAME, @V_ENAME, @V_DVALUE, @V_SVALUE, @V_DESC;
 --END

 --CLOSE CodeData;
 --DEALLOCATE CodeData;
 --==============================================================================
 --select OrgNode.ToString() AS [PATH], * from TBB_CODE;
 --SELECT * FROM #RetTable;

END

 

3. 데이터 삭제 프로시져

/****** Object:  StoredProcedure [dbo].[SP_CODE_DELETE]    Script Date: 2015-03-21 오후 12:09:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  jwcho
-- Create date: 2015.03.20
-- Modify date: 2015.03.20
-- Description: 기본코드 정보를 검색한다.
-- 주의사항: 소속그룹이 없이 기본코드 또는 명칭을 검색하면 이 프로시져를 사용하여 검색하는 것이 단순검색하는 것보다 많이 느리다.
-- SP_CODE_DELETE 'BS0001003600030014'
-- =============================================
ALTER PROCEDURE [dbo].[SP_CODE_DELETE]
 @V_BASE_CD VARCHAR(50),  -- 코드
 @V_DEBUG INT=0
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @V_SQL VARCHAR(MAX)

 IF @V_BASE_CD IS NULL OR LEN(@V_BASE_CD) < 1
 BEGIN
  SELECT -1 'RetVal', '코드가 올바르지 않습니다.' 'MSG', @V_BASE_CD 'CODE';
  RETURN
 END

 IF EXISTS (SELECT BASE_CD FROM TBB_CODE WHERE BASE_CD=@V_BASE_CD AND YN='N')
 BEGIN
     -- modify statements for procedure here
  SET @V_SQL = 'UPDATE TBB_CODE SET '

  SET @V_SQL = @V_SQL + 'YN=''Y'''
  SET @V_SQL = @V_SQL + ',YN_DATE=GETDATE()'
  SET @V_SQL = @V_SQL + 'WHERE BASE_CD='''+@V_BASE_CD+''' AND YN=''N'''

  IF @V_DEBUG=0
   EXECUTE (@V_SQL)
  ELSE
   PRINT @V_SQL

  SELECT 1 'RetVal', '기본코드 '''+@V_BASE_CD+''' 를 삭제했습니다.' 'MSG', @V_BASE_CD 'BASE_CD'
 END
 ELSE
  SELECT 2 'RetVal', '기본코드 '''+@V_BASE_CD+''' 가 없습니다.' 'MSG', @V_BASE_CD 'BASE_CD'

END

4. 데이터 검색 프로시져

/****** Object:  StoredProcedure [dbo].[SP_CODE_SELECT]    Script Date: 2015-03-21 오후 12:10:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  jwcho
-- Create date: 2015.03.20
-- Modify date: 2015.03.20
-- Description: 기본코드 정보를 검색한다.
-- 주의사항: 소속그룹이 없이 기본코드 또는 명칭을 검색하면 이 프로시져를 사용하여 검색하는 것이 단순검색하는 것보다 많이 느리다.
-- SP_CODE_SELECT 'BS%','CD_GRP','[ORDER]',0,0
-- =============================================
ALTER PROCEDURE [dbo].[SP_CODE_SELECT]
 @V_WORD VARCHAR(50)=NULL,
 @V_FIELDNAME VARCHAR(50)=NULL,   -- 검색항목: 필드명
 @V_ORDER VARCHAR(255)=NULL,
 @IS_HISOTY INT=0,
 @V_DEBUG INT=0
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @V_SQL VARCHAR(MAX)
 DECLARE @SIGN VARCHAR(5)='='

 
 SET @V_SQL = 'SELECT DISTINCT [OrgNode], [OrgLevel], [BASE_CD],[CD_GRP],[GRPNAME],[CD_NAME],[CD_ENAME],DVALUE,SVALUE,[DESC],[ORDER],[REG_DATE],[CDATE]'+CHAR(13)
 SET @V_SQL = @V_SQL+'FROM V_CODE'+CHAR(13)
 SET @V_SQL = @V_SQL+'WHERE 1=1'+CHAR(13)

 IF dbo.FN_NullCheck(@V_WORD)=0
 BEGIN
  IF CHARINDEX('%', @V_WORD) > 0
   SET @SIGN = 'LIKE'

  SET @V_SQL = @V_SQL+'AND '+CASE WHEN dbo.FN_NullCheck(@V_FIELDNAME)=0 THEN @V_FIELDNAME ELSE '[BASE_CD]' END
   +' '+@SIGN+' '''+@V_WORD+''''
 END

 IF @IS_HISOTY=0
  SET @V_SQL = @V_SQL+' AND YN=''N'''

 IF dbo.FN_NullCheck(@V_ORDER)=0
  SET @V_SQL = @V_SQL+CHAR(13)+'ORDER BY '+@V_ORDER

 IF @V_DEBUG=0
  EXECUTE (@V_SQL)
 ELSE
  PRINT @V_SQL

END

 

[참조] 데이터 유형 hierarchyid를 이용하지 않고 일반적인 데이터 유형을 이용한 트리구조

/****** Object:  StoredProcedure [dbo].[SP_GET_CODE_TREE]    Script Date: 2015-03-21 오후 12:14:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  jwcho
-- Create date: 2014.08.25
-- Modify date: 2014.08.25
-- Description: 기본코드 정보를 검색한다.
-- 주의사항: 소속그룹이 없이 기본코드 또는 명칭을 검색하면 이 프로시져를 사용하여 검색하는 것이 단순검색하는 것보다 많이 느리다.
-- SP_GET_CODE_TREE 'NULL',NULL,NULL,'CD_GRP,[ORDER]',1
-- SP_GET_CODE_TREE '_ROOT_',NULL,NULL
-- SP_GET_CODE_TREE 'BS%',NULL,NULL
-- SP_GET_CODE_TREE 'MOLD',NULL,NULL,'CD_GRP,[ORDER]',1
-- SP_GET_CODE_TREE 'BS00010008','BS000100080002',NULL
-- SP_GET_CODE_TREE NULL,'BS0001','공통(노임)'
-- SP_GET_CODE_TREE NULL,NULL,'공통(노임)','GRPNAME,[ORDER]',1
-- =============================================
ALTER PROCEDURE [dbo].[SP_GET_CODE_TREE]
 @V_GROUP VARCHAR(50)=NULL, -- 소속그룹 ID
 @V_CODE VARCHAR(50)=NULL, -- 코드
 @V_NAME VARCHAR(50)=NULL, -- 명칭
 @V_ORDER VARCHAR(50)='CD_GRP,[ORDER]', -- 정렬칼럼
 @V_DEBUG INT=0
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @V_SQL VARCHAR(MAX);
 DECLARE @SIGN VARCHAR(5)='='

 SET @V_SQL='WITH CODE_CTE (LVL, [PATH],BASE_CD,CD_GRP,[GRPNAME],CD_NAME,CD_ENAME,DVALUE,SVALUE,[DESC],[ORDER],[REG_DATE],[CDATE]) AS ('+CHAR(13);

 -- Anchor member definition'+CHAR(13)
 SET @V_SQL=@V_SQL+' SELECT 1 AS LVL,CONVERT(VARCHAR(MAX),[BASE_CD]) [PATH],[BASE_CD],[CD_GRP],[GRPNAME],[CD_NAME],[CD_ENAME],DVALUE,SVALUE,[DESC],[ORDER],[REG_DATE],[CDATE]'+CHAR(13);
 SET @V_SQL=@V_SQL+' FROM dbo.V_SNP_CODE B'+CHAR(13);
 SET @V_SQL = @V_SQL+'WHERE 1=1'+CHAR(13);

 IF dbo.FN_NullCheck(@V_GROUP)=0
 BEGIN
  IF CHARINDEX('%', @V_GROUP) > 0
   SET @SIGN = 'LIKE';

  SET @V_SQL = @V_SQL+'AND [CD_GRP] '+@SIGN+' '''+@V_GROUP+'''';
 END
 ELSE
  SET @V_SQL=@V_SQL+' AND CD_GRP=''_ROOT_'''+CHAR(13);

 -- Recursive member definition
 SET @V_SQL=@V_SQL+' UNION ALL'+CHAR(13)
 SET @V_SQL=@V_SQL+' SELECT LVL+1,CONVERT(VARCHAR(MAX),([PATH]+''/''+E.[BASE_CD])) [PATH],E.[BASE_CD],E.[CD_GRP],E.[GRPNAME],E.[CD_NAME],E.[CD_ENAME],E.DVALUE,E.SVALUE,E.[DESC],E.[ORDER],E.[REG_DATE],E.[CDATE]'+CHAR(13)
 SET @V_SQL=@V_SQL+' FROM dbo.V_SNP_CODE AS E, CODE_CTE AS T'+CHAR(13)
 SET @V_SQL=@V_SQL+' WHERE E.CD_GRP = T.BASE_CD'+CHAR(13)
 SET @V_SQL=@V_SQL+')'+CHAR(13)

 -- Statement that executes the CTE
 SET @V_SQL=@V_SQL+'SELECT DISTINCT LVL, [PATH],BASE_CD,CD_GRP,[GRPNAME],CD_NAME,CD_ENAME,DVALUE,SVALUE,[DESC],[ORDER],[REG_DATE],[CDATE]'+CHAR(13)
 SET @V_SQL=@V_SQL+'FROM CODE_CTE'+CHAR(13)
 SET @V_SQL=@V_SQL+'WHERE 1=1'+CHAR(13)
 
 SET @SIGN = '=';
 IF dbo.FN_NullCheck(@V_CODE)=0
 BEGIN
  IF CHARINDEX('%', @V_CODE) > 0
   SET @SIGN = 'LIKE';
  SET @V_SQL = @V_SQL+'AND [BASE_CD]'+' '+@SIGN+' '''+@V_CODE+'''';
 END
 ELSE IF dbo.FN_NullCheck(@V_NAME)=0
 BEGIN
  IF CHARINDEX('%', @V_NAME) > 0
   SET @SIGN = 'LIKE';
  SET @V_SQL = @V_SQL+'AND [CD_NAME]'+' '+@SIGN+' '''+@V_NAME+'''';
 END

 IF dbo.FN_NullCheck(@V_ORDER)=0
  SET @V_SQL=@V_SQL+'ORDER BY '+@V_ORDER

 IF @V_DEBUG=0
  EXECUTE (@V_SQL)
 ELSE
  PRINT @V_SQL

END

출처: https://devdb.tistory.com/15 [DB 관련:티스토리]