DECLARE @TB_REP VARCHAR(20) -- CIMPLICITY 에서 로깅한 레포트 기본 데이터 테이블
DECLARE @TB_ACC VARCHAR(20) -- 시간별 적산값들의 차가 저장될 테이블
DECLARE @TB_TEMP VARCHAR(20) -- 적산값들의 차를 구하는 과정에서 생성될 임시 테이블
declare @dt1 datetime
declare @dt2 datetime
declare @sDate1 VARCHAR(20)
declare @sDate2 VARCHAR(20)
SET @TB_REP = 'REP_DAY'
SET @TB_ACC = 'REP_DAY_ACC'
SET @TB_TEMP='REP_DAY_TEMP'
set @dt1 = getdate() - 1
set @dt2 = getdate()
set @sDate1 = convert(char(10),@dt1,120)
set @sDate2 = convert(char(16),@dt2,120)
DECLARE @ColName VARCHAR(40)
DECLARE @sSql VARCHAR(8000)
-- 스크롤로 커서를 생성하면 커서 이동이 자유롭다.
-- 기본 커서는 앞으로 이동밖에 안되지만, 속도가 가장 빠르다고 한다.
DECLARE col_cursor SCROLL CURSOR FOR
-- 커서를 이용해 @ColName 변수에 COLUMN_NAME 값들을 저장한다. (@TB_REP 테이블의 컬럼중 이름에 문자열 ACC, RUNMIN 포함된 컬럼의 이름)
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=@TB_REP AND
(COLUMN_NAME LIKE '%ACC%' OR
COLUMN_NAME LIKE '%RUNTIME%')
OPEN col_cursor
FETCH NEXT FROM col_cursor Into @ColName
---------------------------------------------------------------------------------------------
-------------- 원본테이블(@TB_REP)에서) 임시 테이블(@TB_TEMP로 적산데이터 빼오기 ---------------
---------------------------------------------------------------------------------------------
-- SQL 쿼리를 작성한다.
-- 현재 구성 : 현재값, 이전값, 현재값-이전값
-- ,R1.A AS A_1, R2.A AS A_2, R1.A-R2.A AS A 형식으로 계속 추가된다.
SET @sSql = ''
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sSql = @sSql + ',R1.' + @ColName + ' AS ' + @ColName + '_1,R2.' + @ColName + ' AS ' + @ColName + '_2,R1.'
+ @ColName + '-R2.' + @ColName + ' AS ' + @ColName
FETCH NEXT FROM col_cursor INTO @ColName
END
CLOSE col_cursor
질문. 위 부분에서 @sSql 변수에 컬럼네임+알리아스로 쿼리스트링을 만듭니다. 컬럼이 200개가 넘고 컬럼 1개당 약 40byte가량을 잡아먹기 때문에 위와같이 만들면 8000byte를 넘어가 쿼리스트링이 짤리게 됩니다.
이걸 해결 하고자 varchar(8000)짜리 변수 두개를 선언해서 커서 루프돌때 @Ssql이7000바이트 넘어가면 @Ssql2변수에 저장이 되도록 하여 EXEC(@Ssql + @Ssql2) 이런식으로 해도 쿼리스트링은 결국 8000byte밖에 만들어지지가 않더군요.
당최 어떻게 해결해야할까요?
http://sqlsql.tistory.com/23