MS-SQL 자동증가값 컬럼 초기화

고객의 요청으로 특정 스키마에서 자동증가값을 가지는 테이블을 테이블명을 기준으로 필터링하여 자동증가값 컬럼의 최대값을 기준으로 초기화를 을 실행합니다.

“테이블명 처리중 오류가 발생했습니다.” 정도로 간단하게나마 오류처리를 하였습니다.

declare @ident bigint,
        @tName varchar(255),
        @cName varchar(255),
        @sqlText nvarchar(1000),
        @sqlVariable nvarchar(100),
        @schmaName   nvarchar(100),
        @tableFilter nvarchar(100)

set     @schmaName = 'dbo'
set     @tableFilter = '%code%'
/*
    dbo 스키마에서 테이블명 code 가 포함된 모든 테이블 중
    자동증가값 컬럼이 있는 테이블에 대하여
    자동증가값 컬럼의 최대값을 기준으로 초기화를 을 실행합니다.
*/
declare c_identReset Cursor for
SELECT  B.name + '.' +  A.name as tableName,
        columnName
FROM    sys.tables AS A
        INNER JOIN sys.schemas AS B
            ON  A.schema_id = B.schema_id
        inner join (
                    select  distinct
                            object_id,
                            name as columnName
                    from    sys.columns
                    where   is_identity = 1
                    ) as c
            on  c.object_id = A.object_id
WHERE   A.name LIKE @tableFilter
and     B.name = @schmaName
order by A.name  

open c_identReset

fetch next from c_identReset into @tName, @cName

while @@FETCH_STATUS = 0
    begin

        set @sqlVariable = N'@ident bigint'
        set @sqlText = N'
                            begin try
                                select @ident = isnull(max(' + @cName + '), 0) from ' + @tName + N'

                                -- select @ident as maxIdent

                                DBCC CHECKIDENT ( ''' + @tName + N''', RESEED, @ident) WITH NO_INFOMSGS
                            end try
                            begin catch
                                raiserror(''' + @tName + ' 처리중 오류가 발생했습니다'', 16, 1)
                            end catch
                            ' 

        --print @sqlText

        exec sp_executesql @sqlText, @sqlVariable, @ident = 0

        fetch next from c_identReset into @tName, @cName
    end
close c_identReset
deallocate c_identReset

이 사이트는 광고를 포함하고 있습니다.
광고로 발생한 수익금은 서버 유지 관리에 사용되고 있습니다.

This site contains advertisements.
Revenue generated by the ad servers are being used for maintenance.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다