Category Archives: Desenvolvimento

SQL Saturday 689 – Prague – Scripts and Slides

Hi Everyone,

First of all, I want to thank everyone at my session at SQL Saturday 689 in Prague this last weekend. It was a tremendous pleasure for me to present and share a bit of what I know with all of you.

I also want to say THANK YOU to the Czech BI & SQL Pass User Group for putting this amazing event to the community, I know how much work and effort has to be done to have such a great event. You treated not only myself but all the speakers so well, so thanks again for having me! You guys are great!

I also want to say THANK YOU to the Sponsors, with all your support the event was just awesome!

As I promised during my presentation, I would write this post to share the link to where you can download most of the resources used by myself during the presentation.

https://github.com/marcosfreccia/sql-saturday-689-prague

I would like to also ask you a bit of your time to fill up the session evaluation. This means a lot to all the speakers. Doing that, it helps all of us speakers to improve our presentation, subjects, demos and etc.. Please, please, please!! Do it! The link is below.

https://goo.gl/6ZTfH6

Thanks again and see you in 2018!

Regards,
Marcos Freccia
Data Platform MVP

Deletando informações em batches –

Olá pessoal,

Quando trabalhamos bases de dados muito grandes e criticas é normal que alguma forma de purge (expurgo) seja feita no banco de dados, é melhor para a aplicação e também para o DBA. Porem uma grande preocupação quando vamos falar sobre deletar uma grande quantidade de dados é não prejudicar nosso arquivo Transaction Log para que o mesmo não estoure o espaço em disco, como também não bloqueie nossa aplicação que esta tentando inserir ou atualizar dados na base. Alem de tudo isso nos preocupamos com performance, pois uma grande operação de delete poderia impactar todo o nosso ambiente.

Pensando nisso criei um script bem simples, mas que pode te ajudar no momento de realizar esse expurgo da base de dados. Read the rest of this entry

Compilando um codigo C# para o SQL Server

Olá pessoal,

Esses dias precisava gerar uma DLL de um codigo C# para um projeto que estou fazendo no SQL Server. Como eu não sou um expert em desenvolvimento eu pedi para que alguns dos meus amigos DEV’s me ajudassem nisso. Até o momento eu pensava que compilar um codigo e gerar uma DLL só era possivel se você tivesse o Visual Studio para fazer isso.

Depois de algumas pesquisas e até mesmo entender um pouco mais sobre CLR e inclusive .Net, vi que se você tiver apenas o .Net Framework 3.5 instalado na sua maquina você já consegue gerar uma DLL. Abaixo então vou mostrar como realizar o procedimento. Read the rest of this entry

Clean-up the Database

Olá Pessoal,

Alguém aqui já precisou realizar a limpeza de um banco de dados, não precisava exclui-lo e cria-lo novamente? Recentemente precisei realizar esse procedimento em alguns servidores e para não perder tempo criei um script que faz a limpeza dos objetos do banco de dados. Nesse primeiro esboço do script ele já realiza o drop das constraints primeiro para não dar erro e também tudo precisa estar no schema dbo. Futuramente pretendo melhorar o script para realizar o drop independente do schema a qual o objeto pertence. Espero que gostem. Read the rest of this entry

Gerando range de datas

Olá pessoal,

Para aqueles que estiverem procurando por um script que gere uma range de datas para você, abaixo segue o script de uma função para irá realizar esse trabalho.

CREATE FUNCTION dbo.GeraRangeDatas
(@DataInicial date, @NumeroDias int)
RETURNS @DateList TABLE (Posicao int, Data DATE)
AS BEGIN
DECLARE @Ponteiro int = 0;
WHILE (@Ponteiro < @NumeroDias) BEGIN
INSERT INTO @DateList
VALUES(@Ponteiro + 1,
DATEADD(day,@Ponteiro,@DataInicial));
SET @Ponteiro += 1;
END;
RETURN;
END;
GO

Feito a criação da função, basta chamá-lo através do seguinte comando.

SELECT * FROM dbo.GeraRangeDatas(‘2009-12-31’,14);

Onde você passa a data de inicio e o numero de dias a frente que você deseja gerar.

Espero que tenham gostado.

Abraços,
Marcos Freccia

SQL Server 2012: IIF

Olá pessoal,

No SQL Server 2012, possuímos uma nova função chamada de IIF. Essa função tem o seu proposito bastante simples que é: Retornar um valor dentro de uma cadeia de dois valores que dependendo da expressão avaliada pode ser retornada como verdadeira ou falsa.

Atualmente no SQL Server 2008 possuímos a função IF que apenas realiza uma determinada validação que foi proposta e dependendo da validação pode entrar dentro de uma batch ou não de consultas. A grande diferença entre as duas é que com o IIF do SQL Server 2012 é que dois valores podem ser especificados, mas apenas um único valor será retornado como resultado, já o IF que possuímos no SQL Server 2008 e ainda possuímos no SQL Server 2012 valida uma determinada condição e pode retornar ou não resultado ou pode executar uma ou mais linhas de código.

Vamos então a demonstração.

A expressão IIF é denominada pela seguinte sintaxe.

IIF (Expressão Booleana, Valor Verdadeiro, Valor Falso)

logo poderíamos realizar algo do tipo.

SELECT IIF(‘MARCOS’ = ‘FRECCIA’,’TRUE’,’FALSE’)

image

Como podemos ver, aqui também é possível realizar a verificação entre valores texto, e o resultado não necessariamente necessita ser um valor texto, podendo ser números.

SELECT IIF(‘MARCOS’ = ‘FRECCIAs’,0,1)

image

Ou ainda podemos criar algo mais personalizado.

declare @Expressao1 varchar(30) = ‘SQL Server 2008 R2’
declare @Expressao2 varchar(30) = ‘SQL Server 2012’

select IIF(@Expressao1 = @Expressao2, ‘Os Valores Comparados’ + QUOTENAME(@Expressao1) + ‘ e ‘ + QUOTENAME(@Expressao2)
+ ‘ são iguais’,’Os Valores Comparados ‘ + QUOTENAME(@Expressao1) + ‘ e ‘ + QUOTENAME(@Expressao2) + ‘ são diferentes’)

image

Como podem ver pessoal, podemos trabalhar com diversos tipos de dados, onde não importa ser estamos comparando valores texto e retornando valores numéricos para a tela.

O que eu tinha para mostrar para vocês era isso. Espero que tenham gostado.

Abraços,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

SQL Server 2012: THROW

Olá pessoal,

Uma das novas funcionalidades presentes na parte de programação no SQL Server 2012 é o recurso THROW. Esse recurso permite que façamos o lançamento de uma exceção no bloco CATCH quando estamos trabalhando com uma estrutura de erros TRY…CATCH.

Um dos recursos legais que o THROW permite é que você além de jogar na tela sua mensagem de erro personalizada, você pode permitir que ainda assim os erros provenientes do SQL Server sejam retornados na tela. É valido lembrar que em outras versões do SQL Server no bloco CATCH precisamos colocar uma mensagem de erro personalizada e a real mensagem de erro não aparece.

Para demonstrar a utilização dessa clausula, vamos a um breve script.

use master
go
create database db_throw
go
use db_throw
go
create table tblThrow (id int identity primary key, nome varchar(20))
go

create procedure spInsertNewRow
@Name varchar(30)
as

BEGIN TRY
insert into tblThrow
values (@Name)
END TRY
BEGIN CATCH

print ‘ERROR OCURRED’;
THROW;
END CATCH;

Temos aqui apenas a criação de uma nova base de dados e a criação de uma procedure que realiza a inserção de novos registros. Um ponto interessante a ser notado nessa nova clausula é a necessidade das sintaxes dentro do bloco catch estarem sempre finalizadas com ponto e virgula “;”.

Se realizássemos uma inserção deste tipo: exec spInsertNewRow ‘Microsoft SQL Server 2012’ onde nosso campo é um varchar de 20 e temos ao todo 25 caracteres teriamos o seguinte erro.

image

Como podemos ver além do texto personalizado que coloquei no bloco catch a clausula THROW possibilitou que o verdadeiro erro também fosse jogado na tela. Apenas por via das duvidas vamos demonstrar a mesma procedure sem essa nova clausula.

alter procedure spInsertNewRow
@Name varchar(30)
as

BEGIN TRY
insert into tblThrow
values (@Name)
END TRY
BEGIN CATCH

print ‘ERROR OCURRED’;
END CATCH;

E seguido da chamada da procedure exec spInsertNewRow ‘Microsoft SQL Server 2012’ teriamos exatamente o erro que mostra a figura abaixo.

image

Pois é pessoal como podemos ver a clausula THROW nos traz ai mais algumas possibilidades de modificação no nosso codigo.

Espero que tenham gostado desse simples post e até a proxima.

Abraços,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

T-SQL no SQL Server 2012 – Parte 2 – Paginação de dados

Olá pessoal,

Atualmente aplicações web fazem o uso de uma funcionalidade até então presente apenas a nível de desenvolvimento que é o recurso de realizar a paginação dos dados, ou seja, mostrar dados em tela pouco a pouco e não simplesmente retornar tudo, assim evitando problemas de performance.

Foi pensando nisso que no SQL Server 2012 foi implementado um novo recurso juntamente a clausula Order By utilizando dois recursos de nome OFFSET e FETCH.

Para iniciarmos o entendimento sobre essa funcionalidade, precisamos ter em mente dois termos que serão utilizados na clausula Order By.

  • OFFSET: Especifica o numero de linhas a ignorar antes de iniciar o retorno dos dados propostos pela consulta. Esse valor sempre deverá ser maior ou igual a 0(zero)
  • FETCH: Especifica o numero de linhas a retornar depois que a clausula OFFSET foi processada. Esse valor sempre deverá ser um inteiro constante ou uma expressão que é maior  ou igual a 1.

Bom, vamos parar com a parte teórica e vamos demonstrar a parte pratica dessa nova função.

Apenas alguns scripts de criação de base de dados e inserção de dados.

use master
go
create database DB_OrderByClause
go
use DB_OrderByClause
go
create table tblPaginacao (id int identity, nome varchar(100))
go

insert into tblPaginacao
values
(‘Registro 1’),(‘Registro 2’),(‘Registro 3’),(‘Registro 4’),(‘Registro 5’),(‘Registro 6’),
(‘Registro 7’),(‘Registro 8’),(‘Registro 9’),(‘Registro 10’),(‘Registro 11’),
(‘Registro 12’),(‘Registro 13’),(‘Registro 14’),(‘Registro 15’),(‘Registro 16’),(‘Registro 17’),(‘Registro 18’),
(‘Registro 19’),(‘Registro 20’)

  • Consulta 1

select * from tblPaginacao
order by id OFFSET 5 ROWS

OFFSET

Na primeira consulta apenas a clausula OFFSET foi especificada, ou seja, como foi falado anteriormente o OFFSET ignora o numero de linhas desejadas. No exemplo estamos realizando o OFFSET de 5 registros, então é normal que  a consulta seja retornada a partir do registro de numero 6.

  • Consulta 2

select * from tblPaginacao
order by id OFFSET 5 ROWS
FETCH NEXT 10 ROWS ONLY

FETCH

Nessa segunda consulta foi especificado a clausula OFFSET e FETCH, ou seja, de acordo com a consulta será ignorada os cinco primeiros registros e apenas irá retornar os proximos dez registros, por isso a clausula FETCH NEXT 10 ROWS ONLY.

Bom pessoal como vocês puderam ver apenas duas demonstrações basicas de como utilizar esse novo recurso no SQL Server 2012.

Espero que tenham gostado e até a proxima.

Abraços.
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]

T-SQL no SQL Server 2012 – Parte 1

Olá pessoal,

O intuito dessa serie de posts que vou  iniciar agora é mostrar tudo de novo que temos na parte de T-SQL no SQL Server 2012. Antes de iniciarmos é bom deixar frisado que o intuito aqui não é mostrar nada mirabolante, mas sim o SIMPLES! Então esqueçam de ver algo avançado, o que vocês irão ver aqui é o básico.

Para não criar posts extensos que nos cansam de ler, vou faze-lo por partes. Hoje vamos falar de:

  • Execute WITH RESULT SETS
  • Sequence

1) Execute WITH RESULT SETS.

Esse novo recurso surgiu no SQL Server 2012 como uma necessidade de formatação de nossos conjuntos de dados, provenientes de uma stored procedure. Então sua explicação e demonstração é bastante simples. Pegamos um result set que está vindo como saída de uma procedure e mostramos para o usuário da maneira que necessitamos através desse result set personalizado.

Vamos ver como funciona?

Tenho aqui uma simples procedure.

use AdventureWorksDW2012
go

create procedure spGetSalesAmout
as
select FirstName,SalesAmount from FactInternetSales as fact
join DimCustomer as cust
on fact.CustomerKey = cust.CustomerKey

Temos aqui duas possibilidades de deixar nosso result set mais amigavel.

1) Mudar diretamente no codigo T-SQL

2) Utilizar o recurso WITH RESULT SETS.

Vamos ver como funciona?

execute spGetSalesAmout
WITH RESULT SETS
(
([Primeiro Nome] varchar(20),
[Total de Vendas] money)
);

Como vemos aqui, podemos até trocar o tipo de dados que será retornado. Vamos agora ver o resultado.

image

Em questões de usabilidade esse recurso seria interessante onde não podemos mudar o código da consulta T-SQL, por muitas vezes estar capturando dados de outros sistemas.

Como podemos ver um recurso muito simples e que pode nos ajudar bastante.

2) Sequence

Recurso esse muito conhecido no Oracle é a sequence, um objeto responsável por gerar números sequencias. Ai você me pergunta: Mas já temos o identity. Correto, porem o objeto Sequence vem para abrir mais possibilidades de utilização  e como a mesma é um objeto permite outros tipos de gerenciamento que não temos no campo identity.

Como utilizar?

Passo 1: Criação da Sequence.

A criação da sequence é muito simples e com apenas alguns comandos já conseguimos criar.

create sequence DemoSequence
START WITH 1
INCREMENT BY 1;

Até ai também podemos utilizar o identity no campo, já que conseguimos ter o inicio e realizar incrementos personalizados.

Como utilizamos a sequence?

create table Demo1 (id int primary key, nome varchar(100))
go
insert into Demo1
values
(NEXT VALUE FOR dbo.DemoSequence,’Marcos Freccia’)

O comando NEXT VALUE FOR dbo.DemoSequence é o que faz o numero ser gerado e automaticamente incrementado.

image

Se realizarmos mais uma inserção teremos.

image

Como eu disse anteriormente, a Sequence é um objeto então a possibilidade de gerenciamento e de usabilidade é maior por exemplo.

insert into Demo1
values
(NEXT VALUE FOR dbo.DemoSequence +2 ,’Marcos Freccia’)

Resultado.

image

Podemos criar também sequences que possuem um limite máximo de números a serem gerados.

create sequence DemoSequence2
START WITH 1
INCREMENT BY 1
MAXVALUE 5;

Vamos realizar apenas uma demonstração.

create table Demo2 (id int, nome varchar(100))
go
insert into Demo2
values
(NEXT VALUE FOR dbo.DemoSequence2 ,’Marcos Freccia’)
GO 5

select * from Demo2

image

Vamos realizar apenas mais uma inserção.

image

Como puderam ver, a nossa sequence não deixou que realizássemos mais inserções de dados no campo.

Bom pessoal por hoje era isso, espero que tenham gostado e no decorrer do tempo estarei mostrando mais funcionalidades em T-SQL no SQL Server 2012

Retirando a conversão de valores do BCP

Um processo comum que possuímos em nossos ambientes é a importação de dados ou utilizando BulkInsert,BCP, Integration Services enfim e dentro dessa rotina de importação de dados é normal que possuímos registros contendo acentos. E uma coisa que pergunto a vocês é: Como realizar a importação e exportação desses dados sem alterar seu reais valores. Abaixo segue uma dica bastante simples de como realizar esses procedimentos sem retirar os acentos.

No primeiro exemplo vou realizar uma exportação de dados de uma tabela chamada tblBCPExport. A sintaxe abaixo você deve colocar no prompt de comando (CMD)

bcp “bcpExport.dbo.tblbcpExport” out “C:\temp\BCPDBExport.txt” -n -SFRECCIA –T -CRAW –c

image

Olhando o resultado.

image

Agora vem a questao. Qual o parâmetro especificado que nos permite que nenhuma conversão seja realizado nos valores que são exportados?

De acordo com a documentação http://msdn.microsoft.com/en-us/library/aa174646(v=sql.80).aspx temos o seguinte parâmetro “-C code_page”

image

Analisando a tabela acima o código que necessitamos acrescentar então é RAW. O mesmo diz na documentação que nenhuma conversão ocorrera. Verificando a sintaxe do bcp temos o parametro –CRAW especificado.

Mas e na importaçao o mesmo se aplica? Vamos testar.

Possuo uma tabela chamada tblBCPImport na qual vou pegar o resultado do arquivo txt e inserir nessa tabela com o seguinte comando.

bcp “bcpImport.dbo.tblbcpImport” in “C:\temp\BCPDBExport.txt” -n -SFRECCIA –T -CRAW –c

Temos o seguinte resultado

image

Vamos inserir agora sem utilizar o parametro –CRAW.

Comando BCP.

bcp “bcpImport.dbo.tblbcpImport” in “C:\temp\BCPDBExport.txt” -n -SFRECCIA –T  –c

image

Como podem ver a formataçao do resultado ficou totalmente errada.

Bom pessoal por hoje é isso, apenas uma dica de como utilizar o comando BCP.

Abraços,
Marcos Freccia
[MCTS|MCITP|MCT SQL Server 2008]