Category Archives: SQL Server

SQL Server 2008: Resolvendo erro “filegroup is full”

Ontem um banco de dados SQL Server 2008 Express começou a dar a seguinte mensagem de erro:

System.Data.OleDb.OleDbException: Could not allocate space for object ‘XXX’ in database ‘XXX’ because the ‘PRIMARY’ filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup.

Obviamente a primeira coisa que eu fiz foi verificar as configurações dos arquivos do banco. E estava tudo certo, ou seja, crescimento dos arquivos irrestrito, autogrowth ativado, etc. Verifiquei espaço em disco e existiam dezenas de gigas livres.

Depois de uma pesquisada na Internet encontrei alguém que teve o mesmo problema que eu, e resolveu apenas desfragmentando o disco onde o banco de dados estava.

Pois bem, parei o SQL Server e mandei desfragmentar o disco. Quando terminou, reiniciei o serviço do banco e pronto, problema resolvido! Eu achei bem estranho, algo que eu provavelmente não tentaria se não tivesse achado alguma dica, então achei que era algo que valia a pena compartilhar.

UPDATE: Alguns dias depois o problema voltou. Achei estranho porque depois do primeiro caso, agendamos o defrag automático dos discos durante a madrugada.  A mensagem era a mesma e não ajudava muito. Olhando nos logs do Windows fomos descobrir o real problema.

CREATE DATABASE or ALTER DATABASE failed because the resulting cumulative database size would exceed your licensed limit of 4096 MB per database.

Alguém matou? Isso mesmo. Estávamos usando o SQL Server 2008 Express que é limitado a bancos de apenas 4GB e nosso banco tinha acabado de chegar nesse limite. Foi só atualizar para 2008 R2, que tem limite de 10GB, e o problema estava resolvido. Espero que desta vez em definitivo. Ou pelo menos até nosso banco chegar aos 10GB. ;)

Extrair primeiro nome usando SQL v2.0

Fiz o refactoring aplicando as ótimas dicas que recebi do pessoal no post anterior e a versão 2.0 da consulta ficou assim:

Firebird

SELECT LEFT(NOME_COMPLETO, POSITION(' ' IN (NOME_COMPLETO || ' '))) FROM TABELA

SQL Server

SELECT LEFT(NOME_COMPLETO, CHARINDEX(' ', NOME_COMPLETO + ' ') ) FROM TABELA

Muito melhor! Obrigado pelas dicas.

Extrair primeiro nome usando SQL

Você tem um campo string onde guarda o nome completo e precisa escrever uma consulta que traga apenas o primeiro nome.

Eu cheguei ao resultado abaixo, não conseguindo uma consulta que funcionasse ao mesmo tempo com Firebird e SQL Server.

Firebird

SELECT IIF(POSITION(‘ ‘ IN NOME_COMPLETO) > 0, SUBSTRING(NOME_COMPLETO FROM 1 FOR POSITION(‘ ‘ IN NOME_COMPLETO) – 1), NOME_COMPLETO) FROM TABELA

SQL Server

SELECT CASE WHEN CHARINDEX(' ', NOME_COMPLETO) > 0 THEN SUBSTRING(NOME_COMPLETO, 1, CHARINDEX(' ', NOME_COMPLETO) - 1) ELSE NOME_COMPLETO END FROM TABELA

Qualquer idéia melhor é bem-vinda.

UPDATE: Baseado no feedback recebido, refatorei a consulta, veja aqui a versão 2.

Microsoft Web Platform Installer

A maioria que trabalha com a plataforma de desenvolvimento da Microsoft já deve conhecer, mas o Web Platform Installer tem me sido tão útil que acho que nunca é demais espalhar a dica.

Basta acessar www.microsoft.com/web, baixar o executável de 2MB, selecionar o que deseja instalar e pronto.  Ele baixa tudo da Internet e instala sem perguntar praticamente nada.

IIS, .NET Framework, Visual Studio, SQL Server, vários aplicativos, incluindo alguns em PHP (WordPress, Joomla) já deixando o IIS configurado para rodá-los.

Ainda não baixou o Visual Studio 2010 Express? Baixe por ele, muito mais fácil.

Enfim, acho que é uma ferramenta que todos os desenvolvedores deveriam conhecer.

Backup SQL Server Express via linha de comando

Uma das desvantagens das versões Express do SQL Server é não ter o SQL Agent, que te permite agendar backups e outras tarefas administrativas nos seus bancos de dados.

No caso do backup, você pode facilmente automatizar usando o agendador de tarefas e um arquivo .bat com os comandos abaixo, que já inclui a compactação usando 7-Zip:

sqlcmd.exe -S (local)\SQLExpress -Q "BACKUP DATABASE MeuBanco TO DISK='d:\backup\meubanco.bak' WITH FORMAT"

"c:\program files\7-zip\7z.exe" a d:\backup\meubanco.7z d:\backup\meubanco.bak

É uma dica simples, mas que pode ser usada como ponto de partida para um script mais avançado e que atenda outras necessidades. Afinal, todo mundo precisa agendar backups de uma forma ou de outra.

E não esqueça de manter o backup bem longe do servidor. :)

Não deixe para amanhã

Como desabilitar rapidamente constraints e triggers de um banco SQL Server

Quando se está importando dados para um banco, as constraints e triggers podem ser um chato obstáculo. Em alguns casos poder ser muito mais fácil desabilitar tudo e reativar no final do processo. Pesquisando sobre isso, encontrei essa ótima dica no StackOverflow.

Para desabilitar todas as constraints e triggers de todas as tabelas do banco:

exec sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"
exec sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER ALL"

Para habilitar:

exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
exec sp_msforeachtable "ALTER TABLE ? ENABLE TRIGGER ALL"

Alias, essa sp_msforeachtable é muito interessante e pode ser explorada de muitas formas diferentes. Testei no SQL Server 2008, mas deve funcionar no 2005 pelo menos.

Um detalhe a ser observado é que esse comando não desabilita constraint de PK nem UNIQUE.

SQL Server 2008 Express e a dependência do .NET 2.0 SP2

Hoje tentei instalar o SQL Server 2008 Express em um servidor Windows 2008. Logo no início da instalação ele já para e dá o seguinte erro:

SQL Server 2008 Setup requires Microsoft .NET Framework 2.0 SP2 to be installed.

Lá fui eu a procura do tal .NET 2.0 SP2. Depois de algum tempo, percebi que não existe download do tal .NET 2.0 SP2. Achei estranho e comecei a pesquisar até encontrar esse post que explica a pegadinha.

Na verdade você deve baixar o .NET Framework 3.5 SP1, que já contém o .NET Framework 2.0 SP2. :)