segunda-feira, 22 de junho de 2009

Gerando um insert baseado nos dados de uma tabela

Existe uma procedure disponível no MS-SQL SERVER 2008 chamada sp_generateinserts, que gera inserts de dados baseados nos registros de uma tabela. Bastante útil quando queremos popular tabelas de ambientes de teste com os dados dos ambinetes de produção.

Em versões anteriores , temos que implementar a nossa procedure nós mesmos. Aqui podemos ver uma implementação desta procedure.

Esta procedure e suas funcionalidades são de responsabilidade do desenvolvedor original e de quem a utiliza. Teste com cuidado em seu ambiente de homologação antes de utilizá-la em produção.

Um comentário:

  1. Procedure na íntegra:

    CREATE PROCEDURE SP_GenerateInserts
    @TableName as varchar(40)
    AS
    BEGIN
    SET NOCOUNT ON;

    create table #tmp (
    SQLText varchar(8000) )

    create table #tmp2 (
    Id int identity,
    SQLText varchar(8000) )

    delete #tmp
    delete #tmp2

    declare @vsSQL varchar(8000),
    @vsCols varchar(8000),
    @vsTableName varchar(40)

    declare csrTables cursor for
    select name
    from sysobjects
    where type in ('u')
    and name = @TableName
    order by name

    open csrTables
    fetch next from csrTables into @vsTableName

    while (@@fetch_status = 0)
    begin

    select @vsSQL = '',
    @vsCols = ''
    select @vsSQL = @vsSQL +
    CASE when sc.type in (39,47,61,111) then
    '''''''''+' + 'isnull(rtrim(replace(['+ sc.name + '],'''''''','''''''''''')),'''')' + '+'''''',''+'
    when sc.type = 35 then
    '''''''''+' + 'isnull(rtrim(replace(substring(['+ sc.name + '],1,1000),'''''''','''''''''''')),'''')' + '+'''''',''+'
    else
    'isnull(convert(varchar,[' + sc.name + ']),''null'')+'',''+'
    end
    from syscolumns sc
    where sc.id = object_id(@vsTableName)
    order by ColID

    select @vsCols = @vsCols + quotename(sc.name,'[') + ','
    from syscolumns sc
    where sc.id = object_id(@vsTableName)
    order by ColID

    select @vsSQL = substring(@vsSQL,1,datalength(@vsSQL)-1)

    select @vsCols = substring(@vsCols,1,datalength(@vsCols)-1)

    insert #tmp
    exec ('select ' + @vsSQL + ' from ' + @vsTableName)

    update #tmp
    set sqltext = 'insert ' + @vsTableName + '(' + @vsCols + ') values(' + substring(sqltext,1,datalength(sqltext)-1) + ')'

    insert #tmp2
    select 'DELETE from ' + @vsTableName

    insert #tmp2 values ('GO')

    if (select count(id) from syscolumns where id = object_id(@vsTableName) and ((status & 128) = 128) ) = 1
    begin
    insert #tmp2
    select 'set identity_insert ' + @vsTableName + ' on'
    end

    insert #tmp2
    select * from #tmp

    if (select count(id) from syscolumns where id = object_id(@vsTableName) and ((status & 128) = 128) ) = 1
    begin
    insert #tmp2
    select 'set identity_insert ' + @vsTableName + ' off'
    end

    insert #tmp2 values ('GO')

    insert #tmp2
    select 'update statistics ' + @vsTableName

    insert #tmp2 values ('GO')

    delete #tmp

    fetch next from csrTables into @vsTableName

    end

    close csrTables
    deallocate csrTables

    update #tmp2
    set sqltext = substring(sqltext,1,charindex(',)',sqltext)-1) + ',NULL)'
    where not(charindex(',)',sqltext) = 0)

    update #tmp2
    set sqltext = replace(sqltext, ',''''',',null')
    where not (charindex(',''''',sqltext) = 0)

    update #tmp2
    set sqltext = replace(sqltext, '(''''',',null')
    where not (charindex('(''''',sqltext) = 0)

    select sqltext from #tmp2 order by id

    drop table #tmp
    drop table #tmp2

    END
    GO

    ResponderExcluir

Leave your comment here!