SQL Server 2005 – Erro Import/Export

Os dias estão bem corridos e só hoje pude resolver aquele problema da importação via interface (SSMS) que ocorreu na semana passada. A mensagem de erro completa é esta:

The SSIS Runtime object could not be created. Verify that DTS.dll is available and registered. The wizard cannot continue and it will terminate.

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90′.

Procurei na internet e muita gente sugeriu a reinstalação das ferramentas, no entanto encontrei uma solução mais curta que resolveu de imediato, apenas registrei a dll, veja:

No menu Iniciar > Executar

regsvr32.exe  “C:\Arquivos de programas\Microsoft SQL Server\90\DTS\Binn\DTS.dll”

e enter :)

Pronto!

Inserindo registros via Bulk Insert

Realizar tarefas utilizando interfaces e nosso amigo (mickey) mouse pode ser muito confortável, no entanto, nem sempre elas estão disponíveis, ou em alguns cenários podem não ser a solução mais adequada.

Hoje pela manhã precisava importar dados para uma de nossas bases, a tarefa era urgentíssima, mas como sabemos, é justamente nessas horas que dá tudo errado! Meu Management Studio acordou mal humorado e quando cliquei na opção importar, ele disse sem pestanejar:

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90′ (…)

“Putz. Ok, hoje é sexta-feira, posso ir no Google e pesquisar sobre esse erro”. Enquanto pensava nisso meu gerente liga perguntando: “Já importou os dados?”…

Ok, vamos deixar o Google pra lá (por enquanto).

Existe uma forma muito prática de importar dados no SQL Server e foi a ela que recorri, o comando T-SQL é o BULK INSERT e é bem simples, veja o exemplo:

BULK INSERT tbTesteImport FROM ‘C:\arquivos_temp\tx_unid.txt’

WITH

(

FIRSTROW = 2,

FIELDTERMINATOR =‘;’

);

Neste caso o arquivo que eu precisava importar era o tx_unid.txt e ele foi gravado em C:\arquivos_temp do meu servidor SQL. Os dados desse arquivo foram importados para a tabela [tbTesteImport] e como ele tinha algumas particularidades tive que informar no BULK INSERT que ele deveria ignorar a primeira linha (era a linha de cabeçalho) e o caractere que separava um campo do outro era o ponto-e-vírgula (FIELDTERMINATOR =’;').

Pronto! Arquivo importado.

O BULK INSERT tem diversos parâmetros que você pode conferir aqui.

Em outra oportunidade irei comentar outras vantagens da utilização do BULK INSERT e também pretendo comentar sobre o BCP, mas agora vou ao Google ver se encontro o remédio pro mau humor do meu Management Studio :)

Até +

Ranking usando ROW_NUMBER()

Existem algumas coisas que não sabemos da existência, outras até conhecemos mas não temos idéia do dia que precisaremos delas. 

Há uns quatro anos eu precisava realizar uma consulta e retornar uma coluna com um seqüencial, numerando as linhas, algo bem simples assim:

 

cod_produto    des_produto                    sequencial

————– —————————— ————-

516E           Arroz                                1

03G            Azeitona                           2

98K            Salame                              3

514A           Tomate                            4

 

Como retornar um sequencial num comando Select simples? Eu não queria usar cursor, nem uma tabela auxiliar, nada disso, queria apenas um seqüencial, simples e objetivo. Enfim, procurei diversos meios e até hoje não soube uma forma simples de fazer isso no SQL Server 2000.

 

Com o SQL Server 2005 aquele bordão “Seus problemas acabaram” cabe perfeitamente nesse cenário. Existe uma função Row_Number() que  faz exatamente isso. Veja um exemplo:

 

SELECT

      cod_produto,

      des_produto,

      ROW_NUMBER() over (order by des_produto) sequencial

FROM

      tb_teste_produto

Como fica subtendido a consulta SQL irá retornar os campos da tabela mais um campo  seqüencial baseado na ordenação do nome do produto. 

Simples não é? 

Trabalhando com subconsultas é possível por exemplo atualizar todos os registros entre as linhas 60 e 80 de uma consulta… é o T-SQL dando suporte às nossas necessidades!

Se você tem outra solução para este cenário contribua deixando seu comentário :)

 

SQL Server 2008 – Está chegando!

 

Depois de dois anos e meio de muito trabalho, em Agosto o SQL Server 2008 entra para a tabela de preços da Microsoft, isso significa que em menos de um mês teremos oficialmente a nova versão do SQL Server.

Pra você que está curioso e que dar uma olhada no que está vindo por aí, o release 0 está disponível aqui, depois deste release, somente o oficial. Esta versão tem validade de 180 dias.

Até +

MSDE – Restaurar backup > que 2 GB

(Essa é para os workaholics)

 

Chega sexta feira, você pega o backup da base de dados do serviço e leva pra casa pra adiantar o trabalho (ou correr atrás do prejuízo). Aí no sabadão, ao tentar restaurar o backup: ERRO.

Tenta o restore de novo e o mesmo erro. Sacanagem…

Então liga pra um amigo, pesquisa no Google e descobre: o MSDE tem uma limitação, não aceita bases de dados maiores que 2 GB!!

 

Ok, como (quase) tudo na vida, existe um “jeitinho” pra resolver isso, mas sinceramente não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc. Repito: não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc.

 

Para utilizar uma base > 2GB no MSDE você vai precisar dos arquivos MDF e LDF da sua base de dados original (a do seu trabalho). O procedimento é simples, mas tem contratempos, porque para copiar esses arquivos a base deve estar “desatachada” (ficou estranho mas não encontrei um termo mais apropriado) ou o serviço do SQL deve estar parado. Escolha uma das duas opções e copie os arquivos.

 

Na sua casa o procedimento vai ser o seguinte.

 

1 – No MSDE crie uma base de dados com o mesmo nome que ela tem em seu trabalho;

2 – Verifique onde os arquivos físicos da base foram criados;

3 – Pare o serviço do SQL Server;

4 – Pegue os arquivos MDF e LDF de seu serviço e cole (substitua!) os arquivos que o SQL acabou de criar para a sua nova base (é muito importante que os arquivos tenham o mesmo nome!);

5 – Inicie o serviço do SQL Server e …

 

Bom trabalho!

Executar DTS via código

Uma dúvida muito comum:

Como executar um pacote DTS via código?

Muito simples… podemos a partir do DOS digitar o seguinte comando:

dtsrun /S nome_servidor /E /N nome_do_pacote

 

O pacote será executado.

Aí me perguntam: Ah, mas eu quero executar a partir do SQL Server!

Ok, existe a opção de utilizar a procedure xp_cmdshell para executar o mesmo comando. Ficaria mais ou menos assim:

EXEC master..xp_cmdshell ‘dtsrun /S nome_servidor /E /N nome_do_pacote’

Porém é bom deixar um alerta: Essa procedure só pode ser executada por sysadmins, e no SQL Server 2005 ela vem desabilitada, (se você quiser utilizá-la deverá realizar isso na SQL Server Surface Area). Isso tudo por razões de segurança, afinal ela tem o poder de executar comandos no sistema operacional… tire suas próprias conclusões sobre isso e pense se é viável habilitá-la em seu ambiente.

Pra finalizar, segue abaixo alguns parâmetros que podem ser interessantes na utilização do comando dtsrun:

  • Executar comando utilizando login do Windows:
    /E  (Conexão confiável)
  • Executar comando utilizando login do SQL:
    /U login /P senha
  • Se o pacote tiver uma senha:
    /M senha

Para ter acesso a uma relação completa digite apenas dtsrun no prompt do DOS e Enter ou acesse este link: http://msdn.microsoft.com/en-us/library/aa224467(SQL.80).aspx.

Até +

Modo de autenticação

Existe uma situação famosa no Microsoft SQL Server que costuma dar trabalho a muitos iniciantes e até mesmo a alguns DBAs mais experientes.

Situação: Você acaba de instalar seu Microsoft SQL Server e logo no primeiro acesso surge o erro:

Login failed for user ‘sa’. The user is not associated with a trusted SQL Server connection. (Microsoft SQL Server, Error: 18452) 

Ok, isso acontece porque o SQL Server tem duas formas de autenticação: Autenticação Windows e Mixed Mode (Autenticação com login Windows e/ou login SQL Server), e por padrão, a instalação vem configurada como Windows Authentication, logo, quando o usuário tenta acessar a instância com um login do SQL Server (normalmente o famoso ‘SA’) o sistema manda aquela advertência.

Antes da solução, é bom frisar que por questões de segurança a Microsoft recomenda o modo Windows Authentication, mas se você quer/precisa usar o SA ou outro login criado diretamente no SQL Server, siga os seguintes passos:

Através do Microsoft SQL Server Management Studio (ou Enterprise Manager na versão 2000), clique sobre a instância (Nome do Servidor) com o botão direito e escolha a opção Properties. Na janela Server Properties, clique em Security; em Server authentication clique em SQL Server and Windows Authentication mode.

Pra concluir esta etapa clique no botão OK.

Depois disso o sistema apresenta a seguinte mensagem (que infelizmente nem todos os usuários lêem):

Some of your configuration changes will not take effect until SQL Server is restarted. 

Então é isso, para efetivar a alteração desta configuração é necessário reiniciar o serviço do SQL Server. Existem outras possíveis razões para a ocorrência deste erro, falarei sobre elas em outro dia.

Se eu não consegui te ajudar sugiro uma consulta ao Books Online ou aquela pesquisada básica no Google, ok?   

Um abraço e ótima semana.