none
Script dinânmico RRS feed

  • Pergunta

  • Olá pessoal,

    Estou tentando tornar dinâmico alguns serviços de manutenção de banco para não precisar ficar digitando várias vezes o nome de uma base. O primeiro que estou tentando fazer executar um SHRINKFILE numa base:

    DECLARE @BASE AS VARCHAR(30)
    DECLARE @CMDSQL AS VARCHAR(MAX)
    DECLARE @busca AS VARCHAR(5)
    SET @busca = '%_log'
    SET @BASE = 'auxilio' -- O usuário só precisará mudar o nome da base
    
    SET @CMDSQL = 	' USE master ' +
    				' GO ' +
    				' ALTER DATABASE ' + @BASE + ' SET RECOVERY SIMPLE WITH NO_WAIT ' +
    				' GO ' +
    				' USE ' + @BASE + ' ' +
    				' GO ' +
    				' DECLARE @nome AS VARCHAR(100) ' +
    				' SET @nome = (SELECT name FROM sysfiles WHERE name LIKE ' + @busca + ')' +
    				' DBCC SHRINKFILE (@nome,1) ' +
    				' GO ' +
    				' USE master ' +
    				' GO ' +
    				' ALTER DATABASE ' + @BASE + ' SET RECOVERY FULL WITH NO_WAIT ' +
    				' GO ' +
    				' USE ' + @BASE + 
    				' GO ' +
    				' DBCC SHRINKDATABASE(N' + @BASE + ') ' +
    				' GO ';
    
    EXEC(@CMDSQL);
    
    

    Mas está dando o seguinte erro:

    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a 'GO'.
    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a 'GO'.
    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a '_log'.
    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a 'GO'.
    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a 'GO'.
    Mensagem 102, Nível 15, Estado 1, Linha 1
    Sintaxe incorreta próxima a 'GO'.
    
    Horário de conclusão: 2019-11-17T11:34:39.3648755-03:00

    Como posso resolver este problema?

    Talvez resolvendo este problema, consiga resolver o script que faz, ao mesmo tempo, o backup de uma base, restaura em outra de teste e faz um SHRINKFILE. 

    Grato,

    Ilano.

    domingo, 17 de novembro de 2019 14:48

Todas as Respostas

  • Retire os "GO".

    Inclua ";" ao final de cada comando.

    -- código #1
    DECLARE @BASE AS VARCHAR(30);
    DECLARE @CMDSQL AS VARCHAR(MAX);
    DECLARE @busca AS VARCHAR(5);
    SET @busca = '%_log';
    SET @BASE = 'auxilio'; -- O usuário só precisará mudar o nome da base
    
    SET @CMDSQL = 	' USE master; ' +
    				' ALTER DATABASE ' + @BASE + ' SET RECOVERY SIMPLE WITH NO_WAIT; ' +
    				' USE ' + @BASE + '; ' +
    				' DECLARE @nome AS VARCHAR(100); ' +
    				' SET @nome = (SELECT name FROM sysfiles WHERE name LIKE ''' + @busca + '''); ' +
    				' DBCC SHRINKFILE (@nome,1); ' +
    				' USE master; ' +
    				' ALTER DATABASE ' + @BASE + ' SET RECOVERY FULL WITH NO_WAIT; ' +
    				' USE ' + @BASE + '; ' +
    				' DBCC SHRINKDATABASE(N''' + @BASE + '''); ';

    PRINT @CMDSQL;

     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    domingo, 17 de novembro de 2019 15:39
  • ilanocf,

    Tem um exemplo de código que eu elaborei a alguns anos e sempre utilizo, veja se te ajuda:

    Use TempDB
    
    If Object_Id('TempDB..#RelacaoBancos') IS NOT NULL
     Begin
    
      Truncate Table #RelacaoBancos
    
     End
     Else
     Begin
    
      Create Table #RelacaoBancos
      (Codigo TinyInt Identity(1,1),
       DatabaseName Varchar(100),
       Space_DataFile Int,
       Space_LogFile Int)
    
     End
     
    DECLARE @DatabaseName varchar(100), @cmd varchar(1000), @Indice Int
     
    DECLARE cur_SpaceUsed CURSOR FOR
     
    SELECT name FROM MASTER..SYSDATABASES
    WHERE  name NOT IN ('master', 'msdb', 'model', 'tempdb')
    and    status <> 66048
    Order By Name
     
    OPEN cur_SpaceUsed
    FETCH NEXT FROM cur_SpaceUsed
    INTO @DatabaseName
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
       SELECT @cmd =  'SET NOCOUNT ON' + char(10) +
              'USE ' + @DatabaseName + '' + char(10) + 
    
              '
               DECLARE  @SizeDataFile Int, 
                                @SizeLogFile Int
               
               
               Set @SizeDataFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupId >= 1)
               Set @SizeLogFile=(Select Sum(((size*8)/1024)) from SysFiles Where GroupID = 0)        
             
               Insert Into TempDB..#RelacaoBancos(DatabaseName, Space_DataFile, Space_LogFile) 
                                  Values('+''''+@DatabaseName+''''+','+'@SizeDataFile'+','+'@SizeLogFile'+')'
    
     Exec(@cmd)
     
     FETCH NEXT FROM cur_SpaceUsed
    
     INTO @DatabaseName
    END
     
    CLOSE cur_SpaceUsed
    DEALLOCATE cur_SpaceUsed
    
    
    Select Upper(DatabaseName) 'Database',
           Space_DataFile As 'Size Data File in MBs',
           Space_LogFile As 'Size Log File in MBs'
    from #RelacaoBancos
    
    --Encolhendo os Arquivos de Log--
    Declare @Comando VarChar(1000),
            @NomeBancodeDados VarChar(100),
            @Contador TinyInt
    
    Set @Contador=1
    
    While @Contador <= (Select Count(*) from #RelacaoBancos)
     Begin
    
      Select @NomeBancodeDados=DatabaseName from #RelacaoBancos
      Where Codigo = @Contador
    
      Set @Comando='USE '+@NomeBancodeDados+' 
    
      ALTER DATABASE '+@NomeBancodeDados+'  
      SET RECOVERY SIMPLE;
    
      DBCC ShrinkDatabase('+@NomeBancodeDados+',10)
    
      DBCC ShrinkFile(1,TruncateOnly);
    
      DBCC ShrinkFile(2,100);
      
      DBCC ShrinkFile(2,TruncateOnly);
    
      ALTER DATABASE '+@NomeBancodeDados+' 
      SET RECOVERY FULL;'+Char(13)
    
      Exec(@Comando)
    
      Set @Contador=@Contador+1
     End


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 17 de novembro de 2019 16:58
  • Galera, desculpa não ter retornado mas é que tivemos um problema seríssimo com vírus do tipo hansomwere mas já estamos voltando aos poucos.

    Bom, assim que normalizar as coisas vou testar aqui e dou um feedback.

    quarta-feira, 20 de novembro de 2019 19:56