최근 포토로그


SP_HELPTEXT의 고질적인 문제에 대한 고찰 2

내가 여기에 SP_HELPTEXT 에 대한 글만 여러 개 썼었는데, 항상 문제가 발생하였다.

왜 이런 귀찮은 일을 하는지 물어본다면 추가 라인이 갑자기 생기는 문제 때문이다.

내 작업의 특성상 MSSQL 스토어드프로시저를 많이 쓰는데, 
SSMS를 사용하여 프로시저 수정 을 클릭했을 때랑, SP_HELPTEXT를 사용하여 프로시저를 불렀을때랑 결과물이 다르게 나타나는 문제 때문이다.


이게 한번만 수정하면 상관없는데, 여러번 수정을 거치면 기하급수적으로 이쁘게 만들었던 라인들이 엉망이 되어간다는 점이다.

물론 다른 툴을 사용하면 되겠지만 나는 MSSQL 순정, 거기에 SSMS를 사용하므로 SP_HELPTEXT를 수정하지 않으면
결국 에러를 발생시키거나 아니면 엄청나게 이상한 라인을 참으며 작업을 해야 한다.

그 결과의 셈플 화면이 이건데

위에처럼 "WHERE" 부분이 갑자기 튀어나와서 라인이 엉클러지는 문제이다.


그래서 수정을 거치게 되었는데 그게 SP_HELPTEXT2 인데,
문제는 내가 CREATE PROCEDURE 라는 글자를 매번 ALTER PROCEDURE 라는 글자로 바꾸기 싫다는 거다.

그레서 결과물을 커서로 돌려서 첫째라인을 바꾼 후에 PRINT를 출력하였더니
빈칸에 공백이 한개씩 찍혀나오는 버그를 발겼했다.
씨붕
아래 화면에 적나라하게 나타난다.
스페이스가 한칸씩 있다는 말이지. 또한 PRINT의 특성상 맨 마지막 라인 이후에 엔터키가 하나가 먹힌다.
이쯤되면 짜증이 좀 난다.

그래서 어쩔 수 없이 PRINT 부분을 다시 테이블에 넣고 표형태로 결과물을 찍어야 내가 원하는 결과물을 얻어낼 수 있다는 것을 발견했다.


아름다운 결과물을 먼저 감상하자.
이 화면에서는 잘 안보이지만, 빈라인에 공백 1개씩 추가되는 것도 없고, CREATE PROC를 ALTER PROC로 바꾸어주고
그리고 맨 마지막 라인도 깔끔하게 끝나는 버전으로 완성했다.


기뻐서 이것을 최종버전으로 배포합니다.

쌩유

아래부분은 프로시저입니다. ==================================>
ALTER PROCEDURE SP_HELPTEXT2 (@ProcName NVARCHAR(256))
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @SEQ INT
    DECLARE @TEXT NVARCHAR(4000)

    DECLARE @PROC_TABLE TABLE (X1  NVARCHAR(MAX))


    DECLARE @Proc NVARCHAR(MAX)
    DECLARE @Procedure NVARCHAR(MAX)
    DECLARE @ProcLines TABLE (PLID INT IDENTITY(1,1), Line NVARCHAR(MAX))

    DECLARE @NEW_ProcLines TABLE (PLID INT IDENTITY(1,1), Line NVARCHAR(MAX))

    SELECT @Procedure = 'SELECT DEFINITION FROM ['+db_name()+'].SYS.SQL_MODULES WHERE OBJECT_ID = OBJECT_ID('''+@ProcName+''')'

    insert into @PROC_TABLE (X1)
          exec  (@Procedure)

    SELECT @Proc=X1 from @PROC_TABLE

    WHILE CHARINDEX(CHAR(13)+CHAR(10),@Proc) > 0
    BEGIN
          INSERT @ProcLines
          SELECT LEFT(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)-1)
          SELECT @Proc = SUBSTRING(@Proc,CHARINDEX(CHAR(13)+CHAR(10),@Proc)+2,LEN(@Proc))
    END
    --* inserts last line
    INSERT @ProcLines
    SELECT @Proc ;

    --SELECT Line FROM @ProcLines ORDER BY PLID


    DECLARE SCRIPTCURSOR9 CURSOR LOCAL FORWARD_ONLY STATIC FOR
        SELECT PLID, Line FROM @ProcLines ORDER BY PLID

    OPEN SCRIPTCURSOR9

    FETCH NEXT FROM SCRIPTCURSOR9 INTO @SEQ, @TEXT

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @SEQ <= 1
        BEGIN
            SET @TEXT = REPLACE(@TEXT, 'CREATE PROC', 'ALTER PROC')
            SET @TEXT = REPLACE(@TEXT, 'CREATE FUNC', 'ALTER FUNC')
            SET @TEXT = REPLACE(@TEXT, 'CREATE VIEW', 'ALTER VIEW')
        END
        insert into @NEW_ProcLines 
               SELECT @TEXT
        --PRINT @TEXT

        FETCH NEXT FROM SCRIPTCURSOR9 INTO @SEQ, @TEXT
    END

    CLOSE SCRIPTCURSOR9
    DEALLOCATE SCRIPTCURSOR9

    SELECT Line FROM @NEW_ProcLines ORDER BY PLID

    --DROP TABLE  @ProcLines

END
========================================================

맘 놓고 쓰시라



덧글

  • rk 2019/10/28 12:27 # 삭제 답글

    SP_HELPTEXT 의 또 다른 문제는
    일정크기 이상은 다음줄로 바꿔버리는 부분이더라구요
    대상 프로시져가 dynamic 프로시져일경우, 구문중 하나가 길어질때 다음줄로 넘어간 부분때문에 에러발생..
  • 길삼이 2021/02/19 14:13 # 삭제 답글

    고맙습니다. 잘쓸게요!!
댓글 입력 영역