Olá a pessoal,
Hoje vamos ver como fazer uma consulta no banco SQL usando classes .NET. Isso permite que vocês possam automatizar a extração de algum relatório para CSV usando apenas o Powershell e em seguida trabalhar essa massa de dados da forma que desejarem
Separei em 4 passos para facilitar neste caso.
1º: Variáveis, parâmetros e a query em si, pela minha experiencia, devem estar em variáveis, para a conexão processar um objeto do tipo string, dessa forma fica mais fácil evitar bugs no script.
#Set Query Date Variables $datestart= (Get-Date).AddDays(-1).ToString("yyyy-M-dd 00:00:00") $dateend= (Get-Date).AddDays(-1).ToString("yyyy-M-dd 23:59:59") [string]$query="select * from Dates where Initiateddate between '$datestart' and '$dateend'" $filename= (Get-Date).AddDays(-1).ToString("yyyyMMdd")
2º: Conexão, vamos criar uma nova conexão usando a Classe System.Data.SqlClient.SqlConnection, a documentação completa esta acessível no MSDN. Após criar o objeto definimos a string de conexão especificando Servidor, Base, Usuário e senha, caso queira usar autenticação integrada use: Integrated Security=True no lugar do usuario e senha, em seguida chamamos o método .Open() para abrir a conexão com a base.
#Set connection strings $connection=New-Object-TypeName System.Data.SqlClient.SqlConnection $connection.ConnectionString ="server=DatabaseServer;database=GUIDO_DB;uid=guido;password=1234" $connection.Open()
3º: Comando: Vamos chamar o metodo .CreateCommand() para definir a propriedade CommandText, que é o comando a ser enviado e vamos dizer que ele será a variável query, que definimos anteriormente. Após isso iremos enviar o comando e armazenar o resultado na variável $result.
#creating and running the query $command=$connection.CreateCommand() $command.CommandText =$query $result=$command.ExecuteReader()
4º: Resultado, iremos armazenar o resultado dentro da variável $table, que seria um objeto do tipo System.DataTable, com o método .Load() vamos carregar os resultados armazenados dentro da variável, feito isso basta fechar a conexão com o banco.
#store result in the Table variable $table=New-Object-TypeName System.Data.DataTable $table.Load($result) $connection.Close()
Agora podemos simplesmente tratar o resultado como qualquer outro objeto de Powershell, no exemplo abaixo estou enviando para um arquivo CSV.
#store result in the Table variable $table|Export-Csv-Path"$env:USERPROFILEDesktop$filename.csv"-NoClobber-NoTypeInformation-Encoding UTF8 –UseCulture
Duvidas ou sugestões? Comente!
Até a proxima!
2 Comments
eu já fiz utilizando foreach armazenando em um objeto, só não tinha conhecimento deste table.Load vou testar
Fica um pouco mais rapido exibir o resultado em DataTable, agora se estiver fazendo insert, com datatable pode fazer BulkInsert para volumes maiores