Caros,
Uma vez eu precisei ‘limpar’ um BD de produção, foi quando o Fraga ainda estava ajudando a Microsoft no suporte via PrimeIT (já faz tempo!). O fato aconteceu porque os consultores tinham criado muitas empresas de teste na base de produção (pela facilidade de só trocar de empresa ao invés de abrir outra instância) e com isso trouxeram um prejuízo enorme quando fomos migrar de um release para outro, a ponto de termos que debugar processo de upgrade, até então, desconhecido para o suporte da MS Brasil! Acredito eu, que os consultores fazem isto por falta de informação, por não saberem como é o processo de upgrade, onde existem scripts de pré e pós sincronização que executam rotinas em muitas tabelas, uma vez para cada DataAreaId encontrado.

A solução que encontrei na época (e lembrei dela agora porque vi em outro artigo) foi vasculhar tabela por tabela procurando pelos DataAreaIDs que eu gostaria de apagar, o que resultou no sequinte script:

--Declarando as variáveis que irei usar
DECLARE @TABLE VARCHAR(100)
DECLARE @STATEMENT VARCHAR(500)
DECLARE LOCALTABLE CURSOR FOR SELECT NAME FROM   SYS.TABLES
DECLARE @MYDATABASE  VARCHAR(100)
DECLARE @MYCOMPANIES VARCHAR(100)
 
--Especificando a Base de Dados
SELECT @MYDATABASE = 'DAX_HOM'
 
--Especificando os DataAreaIds que eu quero apagar
SELECT @MYCOMPANIES = '(''VC1'', ''VC2'', ''VC3'')'
 
--Abrindo o Cursor
OPEN LOCALTABLE
 
--Carregando o Cursor pela Primeira vez
FETCH NEXT FROM  LOCALTABLE INTO  @TABLE
 
 
WHILE @@FETCH_STATUS = 0
BEGIN
        BEGIN TRY
                SET @STATEMENT = N'DELETE FROM [' + @MYDATABASE + '].[DBO].[' + @TABLE + '] WHERE [DATAAREAID] IN ' + @MYCOMPANIES
                PRINT @STATEMENT
                EXECUTE SP_EXECUTESQL @STATEMENT
        END TRY
        BEGIN CATCH
                PRINT 'DataAreaID não encontrado na Tablea: ' + @TABLE
        END CATCH
        FETCH NEXT
        FROM  LOCALTABLE
        INTO  @TABLE
END
 
CLOSE LOCALTABLE
DEALLOCATE LOCALTABLE

Usei um cursor para navegar em todas as tabelas e, a partir daí, removo o que tiver o DataAreaId que quero, nas tabelas onde não há DataAreaId é gerada uma excessão que é tratada no CATCH e com isso a rotina faz a limpeza geral.

Nem preciso dizer o cuidado que deve ser tomado antes de rodar este comando né!?

[]s
Pichler