헤르메스 LIFE

[MSSQL] TYPE, 배열의 사용 본문

Database

[MSSQL] TYPE, 배열의 사용

헤르메스의날개 2021. 2. 10. 13:25
728x90

MSSQL 에서 컬럼의 TYPE 으로 배열을 사용할 수 있습니다.


CREATE TYPE TB_RETURN AS TABLE
(
    COL1        VARCHAR(8),
    COL2        INT,
    COL3        VARCHAR(1),
    COL4        NVARCHAR(100)
)
BEGIN

  DECLARE @TB_RETURN AS TB_RETURN

  INSERT INTO @TB_RETURN VALUES ('20210208', '116', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '117', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '118', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '119', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '120', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '121', 'E', N'테스트 입니다.')
  INSERT INTO @TB_RETURN VALUES ('20210208', '122', 'E', N'테스트 입니다.')

  SELECT *
    FROM @TB_RETURN

END

MSSQL 프로시저에서 사용

--CREATE PROC PRC_RETURN_PROD_H2
ALTER PROC PRC_RETURN_PROD_H2
      @TB_RETURN       TB_RETURN     READONLY
    , @RESULT          NVARCHAR(255) OUTPUT -- 결과
AS
BEGIN
    SET NOCOUNT ON

    BEGIN TRY

		UPDATE IF_TABLE SET
			   COL3 = B.COL3
			 , COL4 = B.COL4
		  FROM @TB_RETURN B
		 WHERE IF_TABLE.COL1 = B.COL1
		   AND IF_TABLE.COL2  = B.COL2

        SELECT @RESULT = 'S'

    END TRY

    BEGIN CATCH

        SELECT @RESULT = ERROR_MESSAGE()

    END CATCH


END
BEGIN
	DECLARE @TB_RETURN AS TB_RETURN
	DECLARE @RESULT    NVARCHAR(255);

	INSERT INTO @TB_RETURN VALUES ('20210208', '116', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '116', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '118', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '119', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '120', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '121', 'E', N'테스트 입니다.')
	INSERT INTO @TB_RETURN VALUES ('20210208', '122', 'E', N'테스트 입니다.')

	exec PRC_RETURN_PROD_H2  @TB_RETURN, @RESULT output;

	select @RESULT;

END

TYPE 사용 시 치명적인 단점이....

사용된 TYPE 객체를 수정이 굉장히 힘듭니다.

DROP TYPE TB_RETURN  -> 아래와 같은 오류 메시지가 리턴됩니다.

Cannot drop type 'TB_RETURN' because it is being referenced by object ... 

SELECT s.name, o.name, def = OBJECT_DEFINITION(d.referencing_id) 
  FROM sys.sql_expression_dependencies AS d
  INNER JOIN sys.objects AS o
     ON d.referencing_id = o.[object_id]
  INNER JOIN sys.schemas AS s
     ON o.[schema_id] = s.[schema_id]
  WHERE d.referenced_database_name IS NULL
    --AND d.referenced_schema_name = N'dbo'
    AND d.referenced_entity_name = N'TB_RETURN';	

TB_RETURN 이 사용된 모든 PROCEDURE 등의 객체를 찾아서

삭제하고..

TB_RETURN 를 DROP 하고, 다시 생성하고...

다시 모든 PROCEDURE 등의 객체를 생성해야 하는... ㅠ.ㅠ

이것 말고 다른 방법은 없을까요..?

수정할 걸 생각해서 넉넉하게 공간을 잡아두는게 좋을 것 같습니다. ^^

728x90

'Database' 카테고리의 다른 글

[MSSQL] 프로시저 생성 / 실행  (0) 2021.03.23
[Database] INNER JOIN , OUTER JOIN  (0) 2021.03.22
[MSSQL] Lock 확인 / KILL 하기  (0) 2021.01.27
[MSSQL] Multi UPDATE, 다중 UPDATE  (2) 2021.01.19
[MSSQL] 동적 임시테이블 생성  (0) 2021.01.01