Webcasts Microsoft

Hoje apenas uma dica:

Algumas pessoas não conhecem, e outras já ouviram falar mas não usufruem, as vezes por falta de tempo, outras por dificuldades com idioma e etc… minha intenção é clarear um pouco esse assunto: Webcasts Microsoft.

Webcast é algo parecido com uma palestra ou uma vídeo-aula, ministrado por profissionais com grande conhecimento e experiência nos produtos Microsoft. Você pode assistir os webcasts em tempo-real (ao vivo) através da internet ou baixar o conteúdo para assistir depois (por demanda). Assistindo ao vivo você tem a opção de interagir com a turma e enviar perguntas/comentários para o palestrante, tudo isso em tempo real. Os assuntos são os mais diversos, sempre focados nas ferramentas da Microsoft.

Existem webcasts em inglês e português (no fim deste post estão os endereços) e os mesmos tratam de diversos assuntos… por exemplo, você sabia que existe uma versão compacta do SQL Server? Não estou falando da MSDE/Express, mas sim da SQL Server Compact… pois é, existe um webcast falando sobre isso, em português, com duração de 60 minutos, que você pode conferir agora clicando aqui.

Lembro que quando comecei a estudar informática (e isso não faz tanto tempo assim) livros eram escassos e muito caros e nas bibliotecas públicas você só encontrava livros antigos (isso não mudou muito, risos). Fico satisfeito ao ver que em menos de 10 anos esse cenário mudou completamente e a Internet deu às pessoas a democratização da informação de uma forma muito rica.

Abaixo os links:

http://msevents.microsoft.com/CUI/default.aspx?culture=pt-BR (Português)

http://msevents.microsoft.com/CUI/default.aspx?culture=en-us (Inglês)

Uma ótima semana!

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é +

Macro no Excel, coisas da rotina

 

É inevitável na rotina de um DBA ter que utilizar-se de ferramentas que auxiliem seu trabalho.

Ontem recebi uma planilha no seguinte formato:

SETOR SubSetor Regra Subregra Código Descrição
1 01.1       Bla bla bla
    01.11     Bla bla la
      01.11-3   Bla bla bla
        0111-3/01 Bla bla bla
        0111-3/02 Bla bla bla
        0111-3/03 Bla bla bla
        0111-3/99 Bla bla bla

Eu deveria importar esta planilha numa tabela de nosso banco. Dentro da tabela ela ficaria mais ou menos assim:

SETOR SubSetor Regra Subregra Código Descrição
1 01.1 NULL NULL NULL Bla bla bla
1 01.1 01.11 NULL NULL Bla bla bla
1 01.1 01.11 01.11-3 NULL Bla bla bla
1 01.1 01.11 01.11-3 0111-3/01 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/02 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/03 Bla bla bla
1 01.1 01.11 01.11-3 0111-3/99 Bla bla bla

Ok… existe uma hierarquia que visualmente fica melhor representada na primeira tabela, no entanto, dentro do banco os dados deveriam estar como exposto na segunda tabela, isso iria influenciar na chave primária e etc.

Enfim, vamos lá!

Mas faltou um detalhe… a tabela tinha algumas milhares de linhas. Como eu faria isso? CTRL C, CTRL V?? Quantas horas de um trabalho monótono copiando e colando, copiando e colando…

Bha!

Nessas horas eu adoro o Excel e suas macros. Para muitos pode parecer ridiculo mas me ajuda e talvez possa ajudar outras pessoas em situação parecida.

Ok… fiz um pequeno script que varria todas as linhas de uma determinada coluna da planilha, verificando se existiam células vazias. Se a célula está vazia, esta deve receber o conteúdo da célula anterior e assim por diante até o fim.

Muito simples e o trabalho todo, incluindo a importação no banco, não durou 1 hora. Então segue aí o script em VB, escrito dentro do próprio Excel:

Sub Copia_Celula_Anterior()

‘ Copia_Celula_Anterior() Macro
‘ Macro gravada em 1/7/2008 por silas.mendes

‘Declara váriavel de apoio do contador
Dim i As Integer

‘Inicializa váriavel com a primeira linha preenchida da planilha
‘ATENÇÃO: Esta informação sera copiada para outra(s) célula(s), caso
‘esteja(m) vazia(s).

i = 8

‘Varre todas a linhas da coluna até a linha 2371
Do While i < 2371
‘Verifica se a célula atual está vazia
If Range(“E” & i).Value = “” Then
‘Se a célula está vazia, seleciona a última célula
Range(“E” & i – 1).Select
‘Copia os dados da célula selecionada
Selection.Copy
‘Volta a selecionar a célula vazia (atual no loop)
Range(“E” & i).Select
‘Cola o conteúdo na célula vazia
ActiveSheet.Paste
End If
‘Incrementa contador do Loop
i = i + 1

Loop

End Sub

 

É, isso também faz parte da rotina de um DBA :))

Calculando a idade usando T-SQL

O artigo abaixo foi escrito por Lynn Pettis para o site www.sqlservercentral.com. O texto original pode ser lido aqui.


Como calcular a idade de uma pessoa? Isto pode tornar-se um tema polêmico e com inúmeras soluções. Mas antes de criticar este tópico considere que ele pode ajudar a definir algumas regras a serem utilizadas na criação de um algoritmo que calcule a idade.

A parte mais difícil é saber o que fazer com os anos bissextos. Quando é que uma pessoa (objeto/documento) torna-se um ano mais velha? Neste pequeno artigo iremos definir que isto ocorre em 28 de fevereiro de anos não-bissextos.

Antes de mergulhar nos cálculos, vamos fazer alguns cálculos simples usando o SQL Server 2005.

Primeiro, vamos ver o que acontece quando adicionamos um ano às datas: 28/02/2008 e 29/02/2008:

declare @data1 datetime@data2 datetime

set @data1 = ’20080228′

set @data2 = ’20080229′

select dateadd(yy, 1, @data1), dateadd(yy, 1, @data2)

Resultado:

2009-02-28 00:00:00.000  2009-02-28 00:00:00.000

Observem que adicionar um ano para ambas as datas, resultam na mesma data. Vamos ver então o que acontece quando adicionamos 4 anos:

declare @data1 datetime,@data2 datetime

set @data1 = ’20080228′

set @data2 = ’20080229′

select dateadd(yy, 4, @data1), dateadd(yy, 4, @data2)

Resultado:

2012-02-28 00:00:00.000  2012-02-29 00:00:00.000

Veja que agora as datas são diferentes. Isto é o que esperávamos.

Agora vamos ver a função DATEDIFF e ver um pouco como ela trabalha:

declare @data datetime,@date2 datetime

set @data = ’20080229′

set @date2 = ’20090228′

select datediff(yy, @data, @date2)

Resultado:

1

Ok, mas qual o resultado da próxima consulta?

declare @data1 datetime,@data2 datetime

set @data1 = ’20081231′

set @data2 = ’20090101′

select datediff(yy, @data1, @data2)

Resultado:

1

Espere…Isso não está certo, não existe um ano de diferença entre essas datas, alguma coisa deve estar errada.

Como você pode ver a função DATEDIFF retornou o numero da diferença entre os anos e não o número real de anos entre as duas datas.

Nós podemos usar esta informação para criar um T-SQL simples:

declare @data_nascimento datetime@idade int@data_atual datetime

set @data_atual = ’2008-02-28′

set @data_nascimento = ’2007-03-01′

set @idade = datediff(yy,@data_nascimento,@data_atual) - case when @data_atual < dateadd(yy,datediff(yy,@data_nascimento,@data_atual), @data_nascimento) then 1 else 0 end

select @idade

Conclusão

Este é apenas um método para calcular a idade de uma pessoa. Existem outras inúmeras formas que podem ser usadas. Tudo o que posso sugerir é que você use o método que melhor lhe atenda em cada situação.

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.