#06 – Para que serve


Muito boa tarde pessoal……

Mais um dia lindo de muito sol e um pouco de calor para alegrar este sábado! Estou retornando com mais um post dedicado a sessão Para que Serve, sendo este o sexto post desta sessão criada no início de 2016, já passamos da metade do ano.

Pois bem, no post de hoje quero compartilhar com vocês um desafio que passei esta semana realizando a migração de alguns bancos de dados que estavam hospedados em um servidor com o Microsoft SQL Server 2008 R2 Enterprise para um outro servidor rodando o Microsoft SQL Server 2014 Standard.

A princípio algo que parece ser bastante tranquilo pois estamos falando de um upgrade de versão, mas na verdade seria um downgrade de edição, isso mesmo estaria evoluíndo no número da versão mas baixando o nível em relação ao tipo da edição. Foi justamente ai que surgiu o desafio identificar quais recursos meus atuais bancos de dados armazenados na edição Enterprise poderiam ser migrados diretamente para a edição Standard sem correr riscos ou se possível tentar limitar o máximo possível de impactos.

Neste momento, comecei a pensar como poderia realizar este tipo de procedimento de uma maneira fácil, ágil e simples, por alguns instantes pensei que poderia fazer uso do Upgrade Advisor, mas precisa de algo que como eu destaquei acima mais rápido e simples, além disso, uma funcionalidade existente dentro do Management Studio.

Por alguns instantes minha cabeça começou a processamento, me senti um Tom Hanks em um dos seus filmes da série O código da Vinci (nossa quem ve parece que isso seria possível kkkkk) foi como tivesse ocorrido um estálo, um momento de pura nostalgia me fazendo lembrar dos treinamentos de SQL Server 2008 e R2 que ministrei anos atrás(kkkk isso já faz tempo).

Voltando a realidade deixando de lado o momento de ator,  para minha alegria acabei rememorando uma das mais interessantes DMVs – Dynamic Management Views (Visão de Gerenciamento Dinâmica), estou me referindo a: sys.dm_db_persisted_sku_features implementada pela equipe de desenvolvedores e engenheiros do SQL Server a partir da versão 2008 e mantida até as atuais versões incluíndo a nova 2016.

E ai, você conhece esta funcionalidade? Já utilizou? Sabe para que ela serve?

Pois bem, estas e outras possíveis perguntas serão respondidas a partir de agora em mais este post da sessão Para que Serve!


Começa agora o #06 – Para que serve.

Quando pensamos em realizar a migração de um ou mais bancos de dados normalmente temos a necessidade de identificar os possíveis riscos e impactos que esta atividade pode apresentar, para muitos profissionais de banco de dados, administradores, gestores, enfim aqueles que de alguma maneira estão envolvidos neste tipo de cenário querer tentar fazer este procedimento no menor tempo possível, visando gerar o tão temido downtime!!! Isso mesmo tempo de parada que os sistemas podem ficar fora do ar.

Normalmente quando estamos se referindo ao Microsoft SQL Server existem alguns pontos de muito atenção que devemos se atentar um deles é a versão e edição que estamos atualmente utilizando mapeando seus recursos e funcionalidades através de um check-list gerando como resultado um mapeamento de compatilidade para estabelecer o nível de aderencia para a futura versão que vamos utilizar, ainda mais se estiverem planejando realizar o downgrade de edição em conjunto com o upgrade de versão.

Pensando nestes riscos e principalmente no mapeamento a Microsoft introduziu a partir da versão 2008 a DMV sys.dm_db_persisted_sku_features que nos permite de maneira rápida e fácil através do management studio ou via script identificar quais as funcionalidades exclusivas da edição Enterprise que podem estar sendo utilizadas. Como você a edição enterprise apresenta um lista de recursos e funcionalidades exclusivos que tornam esta a edição mais completa e poderosa de todas as edições disponíveis para se utilizar em relação ao SQL Server, dentre estas funcionalidades destaco as mais conhecidas:

Seguindo em frente, agora que já conhecemos algumas das funcionalidades exclusivas da edição Enterprise tendo como base as versões do SQL Server 2008 R2 até a versão 2016, vamos então fazer uso da sys.dm_db_persisted_sku_features, para isso vamos conecte em seu servidor SQL Server, abra uma nova query em seguida execute o bloco de código 1 apresentado abaixo:

— Código 1 — Consultando a lista de recursos habilitados —

Use Master

Go

Select * from sys.dm_db_persisted_sku_features

Go

Pronto, simples e prático, é possível notar que nosso Management Studio retornou um select contendo as colunas:

  1. feature_name = Nome da funcionalidade; e
  2. feature_id = Id ou código da funcionalidade.

Mas nenhum dado foi apresentado em ambas as colunas, isso representa que o banco de dados Master não esta fazendo uso de nenhum recurso exclusivo da edição Enterprise. Então vamos similar o uso de uma funcionalidade exclusiva, para isso vou utilizar como exemplo a CDC ou Change Data Capture, introduzida a partir da versão 2008 SQL Server posteriormente se tornou um recurso nativo do SQL Server. Desta forma, vamos utilizar o bloco de código 2 apresentado abaixo:

— Código 2 — Simulando o uso de uma funcionalidade exclusiva da edição Enterprise

— Criando o Banco de Dados CDC —
Create Database CDC
Go
— Habilitando o CDC para o Banco de Dados —
Use CDC
Go
Exec sys.sp_cdc_enable_db
Go
— Criando a Tabela de Exemplo —
Create Table Produtos
(Codigo Int Identity(1,1) Primary Key,
Descricao VarChar(20))
Go
— Habilitando o Change Data Capture para trabalhar sobre a table Produtos —
EXECUTE sys.sp_cdc_enable_table
@source_schema = N’dbo’,
@source_name = N’Produtos’,
@role_name = N’cdc_Admin’;
GO
Ufa estamos quase lá, agora vamos executar novamente o select na dmv sys.dm_db_persisted_sku_features 1 e observar o retorno de dados apresentados pelo Management Studio:

Select * from sys.dm_db_persisted_sku_features

Go

Muito bem, agora sim, observando o resultado do nosso select podemos notar claramente que estamos fazendo uso de uma funcionalidade exclusiva da edição Enterprise, neste caso será apresentado os seguintes valores:

  1. feature_name = ChangeCapture; e
  2. feature_id = 400.
Legal, muito legal mesmo, que fantástico, como o SQL Server é surpreende, sinceramente esse produto esta sempre me supreendendo com sua capacidade de recursos e funcionalidades, com base, neste simples select fica bem mais fácil obter a lista de funcionalidade exclusivas que estamos utilizando e com isso definir toda a estratégia para migração, upgrade ou qualquer outra técnica que podemos adotar para evitar o máximo possível de riscos e impactos para
nosso ambiente, como também, não proporcionar algum tipo de downtime.
Vale ressaltar que este tipo de recurso pode ser muito útil em ambientes considerados pequenos, mas que pode também ser analisado para cenários mais complexos e críticos.
Sucessooooooo, chegamos ao final de mais um post, tenho a certeza que agora vai ser mais fácil planejar qualquer migração de banco de dados ou versão de SQL Server antes mesmo de realizar esta tão misteriosa, intrigante e talvez complexa atividade.

Valeu galera!

Espero que você tenha gostado, que as informações compartilhadas aqui possam lhe ajudar a se tornar cada vez um profisisonal de banco de dados mais reconhecido e valorizado, algo que atualmente as empresas estão deixando muito de reconhecer o verdadeiro papel de um DBA que muitas vezes passa despercebido, mas é de grande e extremo valor para qual instituição, empresa ou corporação.

Microsoft SQL Server 2016 e String_Split(), agora ficou fácil dividir uma string.


Fala galera, boa tarde, segunda – feira, eita dia complicado, começo de semana é tenso, pois saber que mais um final de semana passou voando é triste. Vamos em frente e pensar que mais um final de semana está chegando, é bem melhor.

Seguindo a onda de informações, anúncios, posts, entre outras formas de divulgação sobre o Microsoft SQL Server 2016, hoje vou destacar mais um pouco no meu blog sobre esta nova versão e destacar mais uma das suas novidades, estou me referindo a nova Table Value Function String_Split(). Algo que realmente era muito pedido pelos desenvolvedores e que a Microsoft demorou um pouco para reconhecer a sua importância, mas na versão 2016 ela está presente e será muito útil.

 

A String_Split()

Pode-se dizer que é uma daquelas funções desejadas por todos os profissionais que trabalham com desenvolvimento e necessitam em algum momento realizar o chamado split de uma string. Se você não sabe ou conhece este termo, split pode ser entendido como fatiar, dividir, cortar, quebrar em pedaços.

Fazendo uma analogia, a string_split() vai fazer exatamente isso com uma string, transformando a mesma em pequenas outras strings (substrings ou partes de uma string).

Funcionalidade ou capacidade considerado por muitos como algo realmente complexo se der feito por um SGBD – Sistema Gerenciador de Banco de Dados, ainda mais para o SQL Server se pensarmos que até a versão 2014 tínhamos a necessidade de customizar este tipo de necessidade.

Mas que para nossa alegria a Microsoft introduziu este recurso na versão RC0 sinal que provavelmente e o que tudo indica a mesma vai fazer parte da versão final do SQL Server 2016.

 

Compatibilidade

Por se tratar de uma nova funcionalidade, até o presente momento a documentação oficial da Microsoft indica que esta função é compatível com a versões:

  • Microsoft SQL Server 2016; e
  • Azure Database.

As versões Azure SQL Data Warehouse e Parallel Data Warehouse até o momento não estão na lista de produtos compatíveis com a esta nova função.

Observação: Um detalhe muito importante é a necessidade do nível de compatibilidade do banco de dados estar definido na versão 130, sendo este o nível do SQL Server 2016.

 

Sua importância. O porquê ela pode ajudar

A String_Split() vem para preencher uma lacuna muito grande deixada pelo tipo de desenvolvimento e engenheiros da Microsoft desde a versão 2008 e 2012, onde novas funções para se trabalhar com string foram adicionadas no produto.

Sua importância vai muito além da capacidade técnica de permitir que uma string seja dividida em pequenas partes e posteriormente armazenada em uma tabela, variável ou função, ela vai com certeza flexibilidade e facilitar em muito a maneira com que os dados podem ser tratados e reconhecidos pelo SQL Server o que poderá permitir a criação de novos padrões de reconhecimento de caracteres.

Uma das grandes vantagens de se utilizar a String_Split() está relacionada com a uma simples sintaxe, onde requer basicamente dois parâmetros.

 

Como utilizar a String_Split()

Criada para ser utilizada de maneira rápida e simples, a String_split é composta pode dois parâmetros string compatíveis com os tipos de dados: (nvarcharvarcharnchar ou char) para a string que desejamos supostamente dividir em conjunto com o caractere reconhecido como “divisor” ou “separador”, que também deve ser informado em um tipo de string compatível com os tipos de dados: nvarchar(1)varchar(1)nchar(1) ou char(1)).

Outra característica muito interessante desta função é a maneira que os dados são apresentados e retornados para usuário, onde podemos ter o retorno do split da string em uma coluna com diversas linhas representando os fragmentos “pedaços” ou “partes” da string, como também um valor caractere no tipo de dados nchar ou nvarchar de acordo com o tipo de dado utilizado, respeitando o tamanho do dado identificado no momento da fragmentação da string. Caso não seja reconhecido o tipo de dados original da string, o resultado da sua fragmentação será retornado com o tipo de dados varchar.

Exemplos

A seguir você vai poder encontrar alguns exemplos de como podemos fazer uso da função String_Split(). Vale ressaltar que esta função se encontra disponível a partir da versão RC0, requerendo a configuração o nível de compatibilidade para o número 130.

Alguns dos exemplos apresentados aqui foram elaborados e executados no banco de dados de exemplo AdventureWorks2016 CTP3, caso venha tenha interesse em realizar o download desta sample database, utilize o link: https://www.microsoft.com/en-us/download/details.aspx?id=49502

Outro detalhe importante a ser destacado é o resultado apresentado para cada exemplo ilustrado a seguir, por padrão o SQL Server gera uma coluna chamada value contendo a lista de valores fragmentados após o processo de split da string.

 

 

— Exemplo 1 – Separando de forma simples uma string –

SELECT *

FROM STRING_SPLIT(‘Junior,Galvão,MVP,SQL Server’,’,’)

Go

 

Resultado

value
Junior
Galvão
MVP
SQL Server

 

— Exemplo 2 – Fazendo uso de variáveis como parâmetros de entrada de valores –

DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,

@separador CHAR(1) =’,’

 

SELECT *

FROM STRING_SPLIT(@string,@separador)

Go

 

Resultado

value
Microsoft
SQL Server
2016
RC0

 

— Exemplo 3 – Armazenando o resultado da divisão de uma string em uma nova tabela –

DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,

@separador CHAR(1) =’,’

 

SELECT * INTO #SplitTable

FROM STRING_SPLIT(@string,@separador)

GO

 

— Visualizando a estrutura da tabela —

sp_Columns #SplitTable

Go

 

— Consultando os dados da tabela —

Select * from #SplitTable

Go

 

Após executar a system stored procedure sp_columns podemos notar que o tamanho e tipo de dados da coluna value criada através do select…into foi definido como Varchar() sendo este o tipo de dados padrão utilizado pela String_Split() para garantir compatibilidade no armazenamento e apresentação de dados oriundos de uma outra tabela.

 

— Exemplo 4 – Apresentando a mensagem quando o separador de string for definido com mais de um caracter —

DECLARE @string VARCHAR(100) = ‘pedrogalvaojunior#@gmail#@com’,

@separador CHAR(2) =’#@’

 

SELECT * FROM STRING_SPLIT(@string,@separador)

Go

 

Como pode ser observado o Microsoft SQL Server 2016 vai lançar e apresentar uma mensagem de erro com o código 214 informando que a quantidade de caracteres ou melhor dizendo que o tamanho utilizado para o parâmetro separador foi definido acima de um caractere, sendo que, este parâmetro só identifica e reconhece um único caractere.

Resultado

Msg 214, Level 16, State 11, Line 3

Procedure expects parameter ‘separator’ of type ‘nchar(1)/nvarchar(1)’.

 

— Exemplo 5 – Apresentando o comportamento da String_Split() quando um parâmetro apresenta valor nulo –

SELECT * FROM STRING_SPLIT(‘pedrogalvaojunior,wordpress,com’,NULL)

Go

 

Para este exemplo 5 o comportamento do SQL Server 2016 é exatamente o mesmo do exemplo 4, onde será apresentanda uma mensagem de erro informando que o tamanho informado no parâmetro separado, foi definido acima de um caractere.

Resultado

Msg 214, Level 16, State 11, Line 3

Procedure expects parameter ‘separator’ of type ‘nchar(1)/nvarchar(1)’.

 

— Exemplo 6 – Realizando o split de uma string com base na junção de uma tabela com a função String_Split() –

— Criando a tabela Split —

Create Table Split

( SplitId INT IDENTITY (1,1) NOT NULL,

SplitValue1 NVARCHAR(50),

SplitValue2 NVARCHAR(50))

GO

 

— Inserindo linhas de registro —

INSERT INTO Split (SplitValue1, SplitValue2)

VALUES (‘Pedro’,’Galvão’),

(‘Junior’,’Galvão’),

(‘Antonio’,’Silva’),

(‘Chico’,’Bento’)

Go

 

— Realizando a Junção da Tabela Split com a função Split_String() —

Select SplitId, SplitValue1, SplitValue2, Value

From Split S Inner Join String_Split(‘Pedro,Antonio’,’,’) STS

On S.SplitValue1 = STS.Value

Go

 

Observe que o SQL Server realizou o split dos dados com base na junção e valores informados para a função e mesmo assim apresentou os dados dados de cada coluna que compõem a estrutura da tabela Split.

 

Resultado

SplitID SplitValue1 SplitValue2 Value
1 Pedro Galvão Pedro
3 Antonio Silva Antonio

 

— Exemplo 7 – Apresentando o resultado quando ambos os parâmetros vazios –

Select * from String_Split(‘ ‘,’,’)

Go

 

Após executa o select acima o SQL Server identificou que ambos os parâmetros encontra-se vazios, sem nenhum tipo de dado que permita fazer a identificação da string e do separador, sendo assim o resultado retornado será uma única linha de registro vazia.

 

Resultado

Value

 

— Exemplo 8 – Apresentando o comportamento da String_Split() quando o caracter do final da string é o mesmo utilizado como separador –

SELECT * FROM STRING_SPLIT(‘Conhecendo,SQL Server,2016,’,’,’)

Go

 

Este é um cenário bem interessante e pode ocorrer a qualquer momento, nesta situação o SQL Server 2016 vai trabalhar da mesma forma que os outros exemplos, analisando e identificando a string e posteriormente fazendo a fragmentação com base no caractere separador, mesmo que este seja um caractere utilizado no final da string.

Note que que criada 4 linhas de registro sendo que a última não apresentará valores por será reconhecida e tratada como uma linha nula ou em branco.

Resultado

value
Conhecendo
SQL Server
2016

 

Legal, legal, acredito que agora ficou ainda mais fácil de entender e compreender como a String_Split() é fácil de ser utilizado e principalmente a maneira que os dados são apresentando e retornado para usuário. Desta forma, vou encerrar mais este artigo por aqui, quero também aproveitar para disponibilizar abaixo uma relação de links sobre os principais posts referentes ao SQL Server 2016 que estou desde 2015 publicando.

 


 

 

Links

Caso você não tenha acessado os posts anteriores dedicados ao Microsoft SQL Server 2016, não perca tempo e a oportunidade de conhecer mais sobre esta nova versão acessando os links abaixo:

https://pedrogalvaojunior.wordpress.com/2015/12/28/microsoft-sql-server-2016-e-json-uma-combinacao-bem-interessante-final/

https://pedrogalvaojunior.wordpress.com/2015/11/09/microsoft-sql-server-2016-e-json-uma-combinacao-bem-interessante-parte-i/

https://pedrogalvaojunior.wordpress.com/2015/10/02/conhecendo-o-live-query-statistics-no-microsoft-sql-server-2016/

https://pedrogalvaojunior.wordpress.com/2015/07/10/microsoft-sql-server-2016-lista-de-novidades-parte-i/

https://pedrogalvaojunior.wordpress.com/2015/07/16/microsoft-sql-server-2016-lista-de-novidades-parte-ii/

https://pedrogalvaojunior.wordpress.com/2015/07/30/microsoft-sql-server-2016-lista-de-novidades-final

 

Conheça o SQL Server 2016 RC0: Faça download da versão RC0 disponibilizada a poucos dias acessando: https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016. Acesse também da documentação oficial Microsoft sobre a String_Split(): https://msdn.microsoft.com/en-us/library/mt684588.aspx

 


 

Conclusão

Como você pode observar uma das mais esperadas funcionalidades foi adicionada ao SQL Server, a capacidade de fragmentar, dividir, fatiar uma string em pequenas partes ou substrings. Recurso mais que necessário e importante para qualquer desenvolver ou profissional de banco de dados que necessita analisar um texto “string” e através de um caractere denominado separador delimitar como pode ser gerada fragmentos deste texto.

A cada novo build liberado pela Microsoft podemos observar e notar o grande trabalho e esforço que esta sendo feito para transformar o Microsoft SQL Server 2016 na maior e principal versão do produto desde o grande salto dado em 2005 com o lançamento naquele momento da versão 2005.

Funções similares ao String_Split() estão sendo cada vez mais disponibilidades e adicionadas ao produto como forma de fazer com que o SQL Server se torne uma plataforma única de desenvolvimento, administração, armazenamento e gestão de banco de dados, isso representa uma grande evolução e atenção das equipes de desenvolvimento e engenheiros do produto em atender e satisfazer a comunidade técnica que se dedica a estudar e conhecer cada vez mais o SQL Server.

Acredito que os exemplos apresentados aqui conseguir mostrar a simplicidade de se trabalhar com esta nova funcionalidade, ilustrando sua simplicidade no uso e forma de obter os resultados.

Mais uma vez agradeço a sua atenção, seu interesse em visitar o meu blog, espero encontra-lo em outras oportunidades. Deixe seus comentários, críticas e sugestões.

Até a próxima.

#01 – Para que serve


Muito bom dia, comunidade…..Tudo bem?

Hoje com muito orgulho e bastante ansiedade estou lançando uma nova sessão no meu blog, tenho a certeza que será algo muito diferente e que poderá trazer bastante interesse de todos. Este é o post #01 da sessão “Para que serve”, uma nova sessão que estará sendo publicada mensalmente com objetivo de apresentar como um script, ferramenta, linha de comando, enfim algo que esteja relacionado ao SQL Server e Banco de Dados que você não conheça ou tenha uma leve ideia de como pode ser utilizado.

Para este primeiro post, vou apresentar um pequeno script que utilizo frequentemente no SQL Server, sempre que necessito identificar algumas informações relacionadas a índices. Segue abaixo o Script #01 – Para que serve:

— #01 – Para que serve —

SELECT OBJECT_NAME(B.object_id) AS TableName,

              B.name AS IndexName,

              A.index_type_desc AS IndexType,

             A.avg_fragmentation_in_percent

FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, ‘LIMITED’) A

            INNER JOIN sys.indexes B WITH(NOLOCK)

             ON B.object_id = A.object_id AND B.index_id = A.index_id

WHERE A.avg_fragmentation_in_percent > 30

AND OBJECT_NAME(B.object_id) NOT LIKE ‘[_]%’

AND A.index_type_desc != ‘HEAP’

ORDER BY A.avg_fragmentation_in_percent DESC


 

Então, veja, analíse e tente identificar o que este pequeno script pode fazer, e agora eu vou fazer a pergunta que leva o nome desta sessão.

Para que serve? Para que serve este script? Você já tem a resposta? Ela é muito simples e bastante útil.

Dicas: Se você analisou o código, poderá ter identificado algumas palavras chaves que podem ajudar:

  • Indexes;
  • Fragmentation;
  • AVG; e
  • Percent.

Hummm, se você juntar todas estas palavras, começamos a ter ideia do que e para que serve este script, se você chegou a conclusão que estamos falando de fragmentação de índices, acerto, consegui descobrir para que serve.

Resposta: O #01 – Para que serve faz referência e apresenta uma das maneiras mais utilizadas no SQL Server para se obter informações sobre índices fragmentados ou com indicadores de fragmentação. A primeira etapa para optar pelo método de fragmentação a ser usado é analisar o índice para determinar o grau de fragmentação.

Usando a função de sistema sys.dm_db_index_physical_stats, você pode detectar a fragmentação em um índice específico, em todos os índices de uma tabela ou exibição indexada, em todos os índices de um banco de dados ou em todos os índices de todos os bancos de dados.

Para índices particionados, sys.dm_db_index_physical_stats também fornece informações de fragmentação por partição.


Então é isso pessoal, este foi #01 – Para que serve, com certeza muito coisa será melhorada, novas ideias e formas de demonstrar como podemos usar e para que serve algo que se relaciona ao SQL Server e Banco de Dados.

Deseje suas críticas, sugestões, comentários e opiniões.

Mais uma vez o meu obrigado, um grande abraço, sucesso, nos encontramos em breve.

Valeu.

Microsoft SQL Server 2016 – Lista de Novidades – Final


Bom dia, bom dia, bom dia!!!!!

Meu deus que friooooo, neste momento 4.5º graus de temperatura em São Roque e região, para começar o dia esquentando nada como tentar escrever mais um post no meu blog, posso dizer que não é uma missão fácil, pois a chuva de conteúdo que esta na internet sobre o novo Microsoft SQL Server 2016 é algo fora do comum, isso sem falar do lançamento do Microsoft Windows 10 que esta bombando no mundo todo.

Mas deixando esta friozinho de lado e seguindo em frente, vou finalizar esta série de posts relacionados as principais novidades do SQL Server 2016, caso você não tenha acessado os outros dois, segue abaixo os links para sua diversão:

Para finalizar esta série, vou destacar na lista de principais novidades liberadas pela Microsoft as seguintes features:

  • Strech Database;
  • Row-Level Security; e
  • Dynamic Data Masking.

Analisando os nomes das features parece que esta se referindo a algo de outro mundo, mas na verdade não é bem assim, todas elas fazem parte de uma lista de solicitações de profissionais da área de banco de dados, que constantemente estão solicitando aos times dos mais diversos níveis de relacionamento com o SQL Server: http://blogs.technet.com/b/sqlserverbrasil/, http://blogs.msdn.com/b/pfebrasilsql/a introdução destes recursos.

Vamos lá:

Strech Database: Outra nova funcionalidade bastante esperada principalmente para os usuários do Azure, através do Strech Database, será possível armazenar porções (partes) de uma tabela no Azure SQL Database, você pode estar se perguntando, como assim partes de uma tabela em outro local e não no meu banco de dados, posso dizer que também fiquei surpreso, mas tudo tem uma explicação.

Através deste recurso, temos a capacidade de armazenar dados históricos contidos em uma tabela de forma segura e transparente diretamente na nuvem, ou melhor dizendo no Microsoft Azure. A partir do momento que este recurso é habilitado, de forma silenciosa os dados considerados históricos são migrados para um banco SQL Azure, tudo isso é feito pelo SQL Server sem exigir qualquer alteração de código em sua query ou aplicação.

Para saber mais sobre este recurso acesse:

 

Row-Level Security: Esta nova funcionalidade poderá ser considerada algo bastante revolucionário no que se dizer respeito a visibilidade e acesso aos dados de uma tabela. A Row-Level Security vai permitir aos DBAs e profissionais da área de banco de dados, realizar um controle de acesso aos dados que estão armazenados em determinadas tabelas, através do uso de funções conhecidas como Predicate, limitando assim que uma possível coluna e seu respectivo valor seja consultado.

Veja um exemplo abaixo que pode ser aplicado já na versão CTP 2.1 e CTP 2.2 do SQL Server 2016:

— Criando novas contas de usuários –

CREATE USER Manager WITHOUT LOGIN;

CREATE USER Sales1 WITHOUT LOGIN;

CREATE USER Sales2 WITHOUT LOGIN;

Go

 

— Criando a Tabela Sales —

CREATE TABLE Sales

(

OrderID int,

SalesRep sysname, — Este é um dos segredos para o RSL funcionar.

Product varchar(10),

Qty int);

Go

— Inserindo dados na tabela –

INSERT Sales VALUES

(1, ‘Sales1’, ‘Valve’, 5),

(2, ‘Sales1’, ‘Wheel’, 2),

(3, ‘Sales1’, ‘Valve’, 4),

(4, ‘Sales2’, ‘Bracket’, 2),

(5, ‘Sales2’, ‘Wheel’, 5),

(6, ‘Sales2’, ‘Seat’, 5);

Go

 

— Consultando os dados —

SELECT * FROM Sales;

Go

 

— Atribuíndo a permissão de Grant para cada usuários na tabela Sales –

GRANT SELECT ON Sales TO Manager;

GRANT SELECT ON Sales TO Sales1;

GRANT SELECT ON Sales TO Sales2;

Go

 

— Criando o Schema Security –

CREATE SCHEMA Security;

GO

 

— Criando a Função Predicate – Security.fn_securitypredicate –

CREATE FUNCTION Security.fn_securitypredicate(@SalesRep AS sysname)

RETURNS TABLE

WITH SCHEMABINDING

AS

RETURN SELECT 1 AS fn_securitypredicate_result

WHERE @SalesRep = USER_NAME() OR USER_NAME() = ‘Manager’;

 

— Criando a Política de Segurança para filtrar e controlar o acesso aos Dados –

CREATE SECURITY POLICY SalesFilter

ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep)

ON dbo.Sales

WITH (STATE = ON);

 

— Realizando o teste de acesso aos dados –

EXECUTE AS USER = ‘Sales1’;

SELECT * FROM Sales;

REVERT;

 

EXECUTE AS USER = ‘Sales2’;

SELECT * FROM Sales;

REVERT;

 

EXECUTE AS USER = ‘Manager’;

SELECT * FROM Sales;

REVERT;

 

Após executar este bloco de código você vai poder observar que o usuário Manager deverá ter conseguido consultar todos os dados da Tabela Sales, já os usuários Sales1 e Sales2 devem ter visto somente 3 cada respectivamente.

 

— Agora vamos desativar a política de segurança –

ALTER SECURITY POLICY SalesFilter

WITH (STATE = OFF);

Go

 

Com isso todos os usuários vão conseguir obter todos os dados da tabela Sales.

Dynamic Data Masking: Traduzindo ao pé da letra – Mascaramento de dados dinâmicos, poxa vida, dizer que o SQL Server é mascarado é brincadeir(kkkkk), na verdade este recurso possibilita que seja aplicado diretamente ao dado um máscara, isso mesmo, definir uma máscara para personalizar as informações que serão apresentadas para o usuário em colunas com dados sensitivos.

O Dynamic Data Masking, limita a exposição de dados confidenciais mascarandoo para usuários não-privilegiados. Mascaramento de dados dinâmico ajuda a evitar o acesso não autorizado a dados confidenciais, permitindo aos clientes designar o quanto os dados confidenciais para revelar com impacto mínimo na camada de aplicação. É uma característica de segurança que esconde os dados no conjunto de resultados de uma consulta sobre campos de banco de dados designado, enquanto os dados no banco de dados não são alterados. Considerado de fácil de utilização com aplicativos existentes, desde que as regras de mascaramento sejam aplicadas nos resultados da consulta. Muitos aplicativos podem mascarar dados confidenciais sem modificar consultas existentes.

Mascaramento de dados dinâmicos é complementar a outras características de segurança do SQL Server (auditoria, criptografia, segurança de nível de linha…) e é altamente recomendável usar esse recurso em conjunto com eles, além disso, a fim de melhor proteger os dados confidenciais no banco de dados.

Para conhecer mais sobre este novo recurso acesse:

Ufa, chegamos ao final, mais uma jornada vencida!!!

Agradeço a sua visita ao meu blog, espero que tenho gostado, nos próximos posts tentarei apresentar e exemplificar um pouco mais sobre algumas destas novas funcionalidades.

Um grande abraço.

Microsoft SQL Server 2016 – Lista de Novidades – Parte II


Bom dia, quinta – feira, começando!!!

Salve comunidade, estou retornando com a segunda parte da Lista de Novidades do Microsoft SQL Server 2016, nova versão do SQL Server que neste momento apresenta muitas especulações, comentários e informações nas Internet, principalmente nas redes sociais.

Por este motivo também não poderia ficar de fora, como já realizado na semana passada com a primeira parte desta lista de novidades, caso você não tenha acessado este é o link:
https://pedrogalvaojunior.wordpress.com/2015/07/10/microsoft-sql-server-2016-lista-de-novidades-parte-i/

Nesta segunda parte, vou destacar mais algumas das principais novidades que a Microsoft esta divulgado em seus Blogs e parceiros, hoje darei destaque para:

  • Multiple TempDB Files;
  • For JSON;
  • Always Encripted; e
  • Polybase.

A seguir destaco estas novidades, através de uma breve descrição:

  • Multiple TempDB Files – Funcionalidade muito aguardada a anos pelos profissionais da área de banco de dados, mais especificamente aqueles que trabalham com o SQL Server, onde a partir da versão 2016, teremos a possibilidade de durante a instalação do SQL Server configurar e definir a quantidade arquivos de dados que devem formar a estrutura do banco de sistema TempDB, onde o número de arquivos é definido com base no seu número de processadores que a instância 2016 estará sendo executada. Para saber mais sobre esta nova feature acesse: http://www.sqlservergeeks.com/tempdb-configuration-sql-server-2016-setup/

 

  • FOR JSON – Uma novidade bastante interessante que mostra o quanto a Microsoft esta se dedicando a acompnhar a evolução das tecnologias de Computação em Nuvem e BigData. A FOR JSON, consiste em uma claúsula da linguagem Transact-SQL criada para ajudar o SQL Server a possibilitar a apresentação e saída de dados no formata JSON de forma nativa, algo que vai muito além de apresentar os dados, mas sim ter a capacidade de formatar estes dados interpretados pelo JSON no formato desejado pelo usuário. Para saber mais sobre esta nova feature acesse: https://msdn.microsoft.com/en-us/library/bb510411%28v=sql.130%29.aspx#ForJson

 

  • Always Encrypted – Este é um recurso bastante interessante na minha opinião e algo que pode complementar o TDE(Transparent Data Encryption) recurso introduzido no Microsoft SQL Server 2008, com a finalidade de permitir criptografia nativa no nível de banco de dados. O Always Encrypted garantir ainda mais que seus dados estão armazenados de forma segura através deste recurso de criptografia, como também, durante os processos de manipulação dos mesmo. Sua principal característica é permitir que a possibilidade de criptografar dados dentro das aplicações que estão fazendo acesso ao SQL Server, tendo a capacidade de utilizar chaves de criptografia nunca reveladas dentro do processo que realização da criptografia do dado. Como resultado, o Always Encrypted fornece uma separação entre aqueles que possuem os dados (e pode visualizálo) e aqueles que gerenciar os dados (mas deve não têm acesso). Para saber mais sobre esta nova funcionalidade, acesse: https://msdn.microsoft.com/en-us/library/mt163865(v=sql.130).aspx e https://channel9.msdn.com/Shows/Data-Exposed/SQL-Server-2016-Always-Encrypted

 

  • Polybase – Na minha opinião uma baita novidade, sinceramente algo que vai muito além de uma novo recurso, mas sim um novo horizonte para os profissionais, desenvolvedores e administradores de banco de dados, funcionalidade que vai permitir um avanço enorme no que se diz respeito a Interoperabilidade do SQL Server com outras tecnologias Non-SQL, como também, tecnologias de acesso e armazenamento de dados dentre elas o Hadoop. O PolyBase é uma nova tecnologia que integra o produto o Microsoft SQL Server Parallel Data Warehouse (PDW), com Hadoop. Ele é projetado para permitir consultas através de dados relacionais armazenados no PDW e dados não-relacionais armazenados no Hadoop de forma distribuída através do sistema arquivos Hadoop (HDFS), ignorando MapReduce distribuído, reconhecido como motor do Hadoop que normalmente é usado para ler dados do HDFS. Você pode criar uma tabela externa em PDW que referencia o Hadoop dados (como um servidor vinculado) e você pode consultar isso com SQL, em essência, adicionando estrutura para dados não-estruturados.

Untitled picturePara maiores informações sobre o Polybase e alguns cenários de uso, acesse: Books Online – Polybase, Polybase Explained, SQL Server 2016 and Polybase, Using Polybase in SQL Server 2016, Polybase in SQL Server 2016 CTP2

Muito bem pessoal, chegamos ao final desta segunda parte da lista de novidades do Microsoft SQL Server 2016, espero que você tenha gostado, na próxima semana chegaremos ao final desta lista, destacando as últimas novidades que Microsoft esta introduzindo no novo SQL Server 2016, dentre as quais chamo sua atenção para: Strech Database e Row-Level Security.

Mais uma vez obrigado por sua visita, fique a vontade para postar suas dúvidas, sugestões, críticas e comentários, sobre este ou qualquer outro post.

Boa semana e até mais.

Microsoft SQL Server 2016 – Lista de Novidades – Parte I


Olá pessoal, bom dia, feriado prolongado no estado de São Paulo.

Mesmo assim, a vida não pode parar e a dissiminação de conhecimento menos ainda, algo primordial em nossas vidas e obrigatória para evolução de todos nós.


Para manter esta tradição nada como trazer informações relevantes e atualizadas, sendo assim, gostaria de destacar um pouco sobre as principais novidades que a Microsoft esta anunciando para a nova versão do Microsoft SQL Server, isso mesmo nova versão, se você nos últimos 2 ou 3 meses não se antenou, já estamos se deparando e caminhando para a versão 2016 do Microsoft SQL Server.

Se você quiser saber mais sobre este preview, recomendo acessar os seguintes links:

http://www.microsoft.com/en-us/server-cloud/products/sql-server-2016/

http://blogs.technet.com/b/dataplatforminsider/archive/2015/05/04/sql-server-2016-public-preview-coming-this-summer.aspx

http://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016

Dentre as diversas novidades que aparecem na presentes na nova versão, gostaria de destacar algumas que realmente não existem nas atuais, dentre elas:

  • Live Query Statistics;
  • Query Store;
  • Temporal Tables;
  • Backup to Azure;
  • Managed Backup;
  • Multiple TempDB Files;
  • FOR JSON;
  • Always Encrypted;
  • Polybase;
  • Stretch Database;
  • Row-Level Security;
  • Dynamic Data Masking.

Outras funcionalidades também estão passando por mudanças e podem ser consideradas como possíveis novidades, é o caso:

  • AlwaysOn;
  • Columnstore Indexes; e
  • In-Memory OLTP.

Por outro lado, outras funcionalidades devem começar a fazer parte da lista de recursos e funcionalidades que descontinuadas ou futuramente descontinuadas, até o presente momento a Microsoft não disponiblizou nenhum lista oficial contendo este itens.

Mas voltando a destacar as novas funcionalidades, nem sempre todas estes itens considerados novos são realmente utilizados, em muito casos existe sempre uma insegurança, medo, relutância e até mesmo desconhecimento sobre como uma ou outra novidade pode ajudar, isso é muito comum de se deparar, as mudanças geram incertezas e inseguranças.

Para tentar ajudar você que esta lendo este post a saber um pouco mais sobre este recursos e de maneira eles podem fazer parte do seu projeto, vou fazer uma breve descrição de alguns deles, e conforme novas informações, exemplos e cenários forem sendo disponibilizados, com certeza, vou procurar compartilhar com você isso.

Vamos lá, vou começar por algo que eu gosto muito no SQL Server, estou falando de estatísticas e na versão 2016, temos a:

  • Live Query Statistics – Uma das funcionalidades que pode surpreender a vida dos DBAs e desenvolvedores, a Live Query Statistisc permite que você possa exibir as estatísticas de consulta ao vivo de uma consulta ativa, proporcionando insights em tempo real, isso é surpreende, saber ao vivo e a cores o que uma consulta que esta ativa, em funcionamento no SQL Server poderá nos propor de decisão.

 

  • Query Store – Outra fantástica funcionalidade que vai ajudar em muito os DBAs na sua longa jornada de análise de planos de execução, a Query Store vai possibilidade fazer a análise de uma plano de execução que possa estar apresentando problemas de desempenho através de uma “indicação” ou “orientação” por parte do SQL Server, poder escolher um plano de execução para processar uma query, olha algo revolucionário.

 

  • Temporal Tables – O nome desta funcionalidade realmente é um pouco estranho, pelo menos na sua leitural, mas com certeza a sua finalidade é bastante interessante e vejo como um grande diferencial. A temporal tables, consiste basicamente em uma tabela que fornece uma exibição de dados em um determinado momento de tempo, isso mesmo, você vai conseguir obter informações sobre os dados de uma tabela, através de uma visão histórica, como se você estivesse voltando ao passado, voltando no tempo a posição de dados daquela tabela.

 

  • Backup to AzureO Backup para Azure recurso é projetado para permitir que você tire um backup do seu banco de dados no local diretamente para o armazenamento de Azure blog, algo que hoje pode ser feito através de recursos e ferramentas de terceiros, mas estará totalmente integrado e funcionando de forma nativa no versão 2016.

 

  • Managed BackupO recurso relacionado com o Microsoft Azure e conhecido como “Backup gerenciado” foi projetado com a finalidade de automatizar backups para o armazenamento de Blob do Azure, muito legal esta funcionalidade, o seu grande diferencial esta justamente na forma que vamos poder gerenciar e administrar os backups de nossos bancos de dados armazenados na estrutura do Azure.

Muito legal estas novas funcionalidades, realmente a Microsoft esta trabalhando forte no SQL Server, na sua capacidade de integração e interoperabilidade.

Vou fazer um pequeno suspense e deixá-los com água na boca em relação as outras novidades, na próxima semana eu retorno com a Parte II desta lista de novidades, destacando como por exemplo: Polybase e Strech Database, ambas inovações presentes na versão 2016 que terão um papel fundamente para o  SQL Server na sua capacidade intregação e interoperabilidade com ferramentas de Bigdata e Hadoop.

Espero que você tenha gostado, até a próxima semana!!!

Abraços.

Short Scripts – Julho – 2014


Boa Tarde Comunidade!

Esta chegando ao final mais uma Copa do Mundo, poxa vida passou rápido demais, mas foi óitmo. Mas a vida continua e se Deus permitir próximas Copas do Mundo virão e teremos mais sucesso e felicidades.

Desta forma, e mantendo a tradição vou compartilhar com vocês alguns do Short Scripts que utilizei nos últimos dias e me ajudarem muito.

Neste relação você vai encontrar exemplos e códigos que envolvem os seguintes recursos, comandos e funcionalidades:

  • Bloco Try…Catch;
  • Claúsula Output;
  • Comando Merge;
  • Constraints Default;
  • Função para Formatação de Valores;
  • Função Unpivot;
  • Script para Insert de Dados;
  • Stored Procedure;
  • Tipo de Dados UniqueIdentifier; e
  • XML com Versionamento e Enconding.

Segue abaixo os Short Scripts:

1– Exemplo – Stored Procedure + Comando Merge + Output:

— Criando a Tabela Producao —
Create Table Producao
(ControleProducao Int Identity(1,1) Primary Key,
OrdemProducao Varchar(20) Not Null,
DataProducao DateTime Not Null,
Quantidade Int Not Null)
On [Primary]
Go

— Criando a Stored Procedure P_FindProducao —
Create Procedure P_FindProducao @OrdemProducao VarChar(20), @DataProducao DateTime
As
Begin
Set NoCount On;

Merge Producao As Target
Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
On (Target.OrdemProducao = Source.OrdemProducao
And Target.DataProducao = Source.DataProducao)
When Matched Then
Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
When Not Matched Then
Insert (OrdemProducao, DataProducao, Quantidade)
Values(Source.OrdemProducao, Source.DataProducao, 1)
OUTPUT deleted.*, $action, inserted.*;

End
Go

Select * from Producao

Insert Into Producao (OrdemProducao, DataProducao, Quantidade)
Values (1,GetDate(),1),
(2,GetDate(),1),
(3,GetDate(),1)
Exec P_FindProducao 1, ‘2014-07-08 10:06:50.297’

 

— Criando a Tabela Producao —
Create Table Producao
(OrdemProducao Varchar(20) Not Null Primary Key Clustered,
DataProducao DateTime Not Null,
Quantidade Int Not Null)
On [Primary]
Go

2 – Exemplo – Stored Procedure + Comando Merge + Output + Try….Catch:

— Criando a Stored Procedure P_FindProducao —
Create Procedure P_FindProducao @OrdemProducao VarChar(20), @DataProducao DateTime
As
Begin
Set NoCount On;

Begin Try

Merge Producao As Target
Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
On (Target.OrdemProducao = Source.OrdemProducao
And Target.DataProducao = Source.DataProducao)
When Matched Then
Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
When Not Matched Then
Insert (OrdemProducao, DataProducao, Quantidade)
Values(Source.OrdemProducao, Source.DataProducao, 1);

End Try

Begin Catch

SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_MESSAGE() AS ErrorMessage,
ERROR_LINE() AS ErrorLine;

End Catch
End
Go

Select * from Producao

Insert Into Producao (OrdemProducao, DataProducao, Quantidade)
Values (1,GetDate(),1),
(2,GetDate(),1),
(3,GetDate(),1)
Exec P_FindProducao 3, ‘2014-07-08 10:26:25.250’

3 – Exemplo – Utilizando – UniqueIdentifier + Default +NewSequentialID:

Create TAble T1
(Codigo UniqueIdentifier Primary Key Default NEWSEQUENTIALID(),
Descricao varchar(100))
Insert into t1 (Descricao)
Values (CONVERT(Varchar(100), NewID()))
Go 10000

4 – Exemplo – Stored Procedure – Script de Insert:

if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_CreateDataLoadScript]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[sp_CreateDataLoadScript]
GO

Create Procedure sp_CreateDataLoadScript
@TblName varchar(128)
as
/*
exec sp_CreateDataLoadScript ‘MyTable’
*/
create table #a (id int identity (1,1), ColType int, ColName varchar(128))

insert #a (ColType, ColName)
select case when DATA_TYPE like ‘%char%’ then 1 else 0 end ,
COLUMN_NAME
from information_schema.columns
where TABLE_NAME = @TblName
order by ORDINAL_POSITION

if not exists (select * from #a)
begin
raiserror(‘No columns found for table %s’, 16,-1, @TblName)
return
end

declare @id int ,
@maxid int ,
@cmd1 varchar(7000) ,
@cmd2 varchar(7000)

select @id = 0 ,
@maxid = max(id)
from #a

select @cmd1 = ‘select ” insert ‘ + @TblName + ‘ ( ‘
select @cmd2 = ‘ + ” select ” + ‘
while @id < @maxid
begin
select @id = min(id) from #a where id > @id

select @cmd1 = @cmd1 + ColName + ‘,’
from #a
where id = @id

select @cmd2 = @cmd2
+ ‘ case when ‘ + ColName + ‘ is null ‘
+ ‘ then ”null” ‘
+ ‘ else ‘
+   case when ColType = 1 then  ””””’ + ‘ + ColName + ‘ + ””””’ else ‘convert(varchar(20),’ + ColName + ‘)’ end
+ ‘ end + ”,” + ‘
from #a
where id = @id
end
select @cmd1 = left(@cmd1,len(@cmd1)-1) + ‘ ) ” ‘
select @cmd2 = left(@cmd2,len(@cmd2)-8) + ‘ from ‘ + @tblName

select ‘/*’ + @cmd1 + @cmd2 + ‘*/’

exec (@cmd1 + @cmd2)
drop table #a

Go

5 – Exemplo – Criando – Função – Formatação de Valores:

CREATE FUNCTION FormataVT (@Valor float)
Returns varchar(30) as
Begin
Return Replace(Replace(Replace(Convert(Varchar, Convert(Money, @Valor), 1), ‘.’, ‘x’),
‘,’, ‘.’),
‘x’, ‘,’);
End;
Go
Declare @Valores Table (Valor_Total float);
INSERT into @Valores values (1032.5), (1542.24);

SELECT dbo.FormataVT(Valor_Total)  from @Valores;

6 – Exemplo – Gerando – XML com Version e Enconding:

DECLARE @xmlsample varchar(max),
@ArquivoXML Varchar(Max)

SET @xmlsample='<?xml version=“1.0” encoding=“UTF-8”?>’

Set @ArquivoXML= (Select CODIGO, Descricao from Produtos for XML Auto)

Select @xmlsample + Char(10) + @ArquivoXML

7 – Exemplo – Utilizando – UnPivot:

— Exemplo 1 —
CREATE TABLE dbo.CustomerPhones
(
CustomerID INT PRIMARY KEY, — FK
Phone1 VARCHAR(32),
Phone2 VARCHAR(32),
Phone3 VARCHAR(32)
);

INSERT dbo.CustomerPhones (CustomerID, Phone1, Phone2, Phone3)
VALUES (1,’705-491-1111′, ‘705-491-1110′, NULL),
(2,’613-492-2222′, NULL, NULL),
(3,’416-493-3333’, ‘416-493-3330’, ‘416-493-3339’);

— Forçando UnPivot sem utilizar o Operador UnPivot —
SELECT CustomerID, Phone = Phone1
FROM dbo.CustomerPhones WHERE Phone1 IS NOT NULL
UNION ALL
SELECT CustomerID, Phone = Phone2
FROM dbo.CustomerPhones WHERE Phone2 IS NOT NULL
UNION ALL
SELECT CustomerID, Phone = Phone3
FROM dbo.CustomerPhones WHERE Phone3 IS NOT NULL;

— Utilizando o Operador UnPivot —
SELECT CustomerID, Phone
FROM
(
SELECT CustomerID, Phone1, Phone2, Phone3
FROM dbo.CustomerPhones
) AS cp
UNPIVOT
(
Phone FOR Phones IN (Phone1, Phone2, Phone3)
) AS up;
— Exemplo 2 —
CREATE TABLE dbo.CustomerPhones2
(
CustomerID INT PRIMARY KEY, — FK
Phone1 VARCHAR(32),
PhoneType1 CHAR(4),
Phone2 VARCHAR(32),
PhoneType2 CHAR(4),
Phone3 VARCHAR(32),
PhoneType3 CHAR(4)
);

INSERT dbo.CustomerPhones2 VALUES
(1,’705-491-1111′, ‘cell’, ‘705-491-1110’, ‘home’, NULL,NULL),
(2,’613-492-2222′, ‘home’, NULL, NULL, NULL, NULL),
(3,’416-493-3333′, ‘work’, ‘416-493-3330’, ‘cell’,
‘416-493-3339’, ‘home’);

— Utilizando o Operador UnPivot —
SELECT CustomerID, Phone, PhoneType
FROM
(
SELECT CustomerID, Phone, PhoneType,
idp = SUBSTRING(Phones, LEN(Phones) – PATINDEX(‘%[^0-9]%’, REVERSE(Phones)) + 2, 32),
idpt = SUBSTRING(PhoneTypes, LEN(PhoneTypes) – PATINDEX(‘%[^0-9]%’, REVERSE(PhoneTypes)) + 2, 32)
FROM
(
SELECT CustomerID, Phone1, Phone2, Phone3,
PhoneType1, PhoneType2, PhoneType3
FROM dbo.CustomerPhones2
) AS cp
UNPIVOT
(
Phone FOR Phones IN (Phone1, Phone2, Phone3)
) AS p
UNPIVOT
(
PhoneType FOR PhoneTypes IN (PhoneType1, PhoneType2, PhoneType3)
) AS pt
) AS x
WHERE idp = idpt;

Pois bem pessoal, estes são os Short Scripts disponibilizados nesta relação, fique a vontade para compartilhar com seus contatos, amigos, DBAs, Profissionais de Banco de Dados, Amantes do SQL Server, Estudantes, enfim para todos.

Agradeço a sua visita, espero que este conteúdo possa te ajudar.

Um grande abraço e Viva a Argentina Futura Tri-Campeã Mundial de Futebol.