Dica do Mês – Conhecendo o Intelligent Query Processing através da Scalar User Defined Function Inlining no Microsoft SQL Server 2019

Conheça o Intelligent Query Processing uma nova abordagem de reconhecimento e processamento de recursos adicionada ao SQL Server a partir da versão 2019, em especial neste post a Scalar UDF Inlining.


Boa tarde, boa tarde a todos, em especial a você amante de banco de dados relacional, principalmente ao Microsoft SQL Server.

Que bom lhe encontrar aqui em mais um post da sessão Dica do Mês, a qual também está passando por algumas mudanças de layout e dinâmica no seu conteúdo para tentar neste momento em que estamos todos em casa oferecer algo mais simples, prático e direto as suas necessidades, bem como, tornando a leitura mais direta ao assunto sem mais enrolações.

Você já deve ter notado em posts de outras sessões, algumas novidades, como o uso de imagens que se relacionam com o tema, a possibilidade de download do conteúdo do post em arquivo .PDF, o acréscimo da sessão links relacionados ao tema, enfim, alguns ajustes e melhorias que vão sendo realizados ao longo do tempo, de acordo com as sugestões, críticas e observações enviadas diariamente pelos mais de 1200 seguidores aqui presentes neste momento.

Para os posts da sessão Dica do Mês, você vai poder observar também algumas novidades, além do conteúdo compartilhado em arquivo .PDF, teremos adicionalmente uma versão do código fonte compartilhada no formato .TXT, em paralelo a este conteúdo disponibilizado para que você possa trabalhar offline, os códigos fontes aqui presentes no post, serão publicados no formato de imagens (no post versão web, já o arquivo no formato .PDF terá todo o conteúdo do código fonte adicionado no formato original), contendo números de linhas de forma sequência, ao invés de postados de forma separada em blocos de código que as vezes se tornam ilegíveis ou de difícil compreensão, por fim, o uso das imagens é uma forma de lhe proporcionar uma navegação mais limpa, colorida e organizada.

Continue Lendo “Dica do Mês – Conhecendo o Intelligent Query Processing através da Scalar User Defined Function Inlining no Microsoft SQL Server 2019”

Short Scripts – Maio 2020

Neste segundo post de 2020 da sessão Short Scripts, você vai encontrar 7 exemplos diferentes de como podemos utilizar as Extended Stored Procedures (XPs), algumas não documentadas no Microsoft SQL Server.


Olá boa tarde, como vai?

Seja bem-vindo, em mais um post da sessão Short Scripts, o segundo post desta sessão em 2020 e o de número 41 em seu total.

Espero que você e seus familiares se encontrem bem neste momento terrível que estamos vivendo em todo Mundo.

Mantendo a tradição estou retornando com mais um conjunto dos “curtos ou pequenos” scripts catalogados e armazenados em minha biblioteca pessoal de códigos relacionados ao Microsoft SQL Server e sua fantástica linguagem de desenvolvimento Transact-SQL.

Como promessa é dívida e deve ser cumprida “ou melhor” compartilhada, vou pagar a minha mais uma vez hoje, feita no encerramento do post anterior publicado no mês de fevereira em 2010, se por acaso você ainda não acessou o mesmo, calma, fique tranquilo, tudo vai dar certo, no encerramento deste post você terá a sua disposição a relação das últimas cinco publicações relacionadas aos Short Scripts.

Vamos caminhar mais um pouco então……..

O post de hoje

Para este post, não vou exatamente compartilhar um conjunto variado de scripts que foram catalogados nos últimos meses, ao contrário, vou disponibilizar um conteúdo que foi elaborado hoje, dedicado de forma única e exclusiva a demonstrar como podemos utilizar as chamadas Extended Stored Procedures no Microsoft SQL Server.

Em conjunto com o uso de forma de execução da Extended Stored Procedure, os exemplos de código aqui compartilhados se relacionam com os seguintes assuntos:

● Cláusula From;
● Cláusula Where;
● Comando Alter Table;
● Comando Begin;
● Comando Begin;
● Comando Create Procedure;
● Comando Create Table;
● Comando Declare;
● Comando Exec;
● Comando Execute;
● Comando Go;
● Comando Insert;
● Comando Reconfigure;
● Comando Select;
● Comando Set;
● Comando Union;
● Comando Update;
● Comando Use;
● DataType Char();
● DataType Datetime;
● DataType Decimal();
● DataType Varchar();
● Diretiva Set;
● Extended Stored Procedure XP_CMDShell;
● Extended Stored Procedure XP_ExecResult;
● Extended Stored Procedure XP_FixedDrives;
● Extended Stored Procedure XP_ReadErrorLog;
● Extended XP_Delete_File;
● Função Convert();
● Função DataLength();
● Função DateAdd();
● Função GetDate();
● System Stored Procedure SP_Configure;
● System Stored Procedure SP_Help; e
● Variáveis.
 

Chegou a hora, mãos nos teclados, a seguir apresento os códigos e exemplos selecionados para o Short Script – Maio 2020. Vale ressaltar que todos os scripts publicados nesta sessão foram devidamente testados, mas isso não significa que você pode fazer uso dos mesmo em seu ambiente de produção, vale sim todo cuidado possível para evitar maiores problemas.

Fique à vontade para compartilhar, comentar e melhorar cada um destes códigos.


Short Scripts

— Exemplo 1 — Identificando a porta Padrão do Microsoft SQL Server através da XP_ReadErrorLog —
Use Master
Go

Exec XP_readerrorlog 0, 1, N’Server is listening on’
Go

— Exemplo 2 — Habilitando a Extended Stored Procedure XP_CMDShell -utilizand a Sigla DSH —

— Ativando a exibição das configurações avançadas —
EXECUTE sys.sp_configure @configname = ‘show advanced options’,@configvalue = 1
Go

— Aplicando a alteração —
Reconfigure
Go

— Ativando para uso da XP_CMDShell —
EXECUTE sys.sp_configure @configname = ‘dsh’,@configvalue = 1
Go

— Aplicando a alteração —
Reconfigure
Go

Observação: Como você deve ter percebido, para se fazer uso da Extended Stored Procedure XP_CMDShell, que por padrão vem desabilitada nas configurações internas do SQL Server, temos a necessidade de ativar a exibição das configurações avançadas da nossa instância ou servidor, utilizando a System Stored Procedure SP_Configure, e posteriormente ativar da XP_ CMDShell.

Caso queira saber mais sobre este recurso e demais configurações existentes, acesse:

— Exemplo 3 — Obtendo a quantidade de Megabytes livres em disco através da XP_FixedDrives
Exec xp_fixeddrives
Go

— Exemplo 4 — Excluíndo arquivos específicos através da XP_DeleteFile
Declare @DateString CHAR(10)
Set @DateString = CONVERT(CHAR(10), DATEADD(d, -2, GETDATE()), 103)

Execute master.dbo.xp_delete_file 0, N’E:\MSSQL2012-Backup\BaanModelEA’,N’bak’, @DateString, 1
Go

— Exemplo 5 — Importando o conteúdo de arquivos .csv para dentro de uma tabela através da XP_CMDShell
CREATE TABLE Test
(Empid varchar(6),
Empname varchar(100),
BirthDate datetime,
Salary decimal(12,2),
Nome Varchar(2000))
Go

INSERT INTO Test
SELECT ‘EMP001′,’Suresh’,’19910619′,3000,’Pedro Galvão’
UNION ALL
SELECT ‘EMP002′,’Ramesh’,’19710103′,20000,’Teste’
UNION ALL
SELECT ‘EMP003′,’Nilesh’,’19800722′,4760,”
UNION ALL
SELECT ‘EMP004′,’Kumar’,’19680911′,42000,”
Go

Declare @Comando Varchar(500)
Set @Comando=’bcp Master..Test out c:\teste.csv -SServer -c -t, /CACP -T’

Exec xp_cmdshell @Comando
Go

— Exemplo 6 — Armazenando o Endereço de IP em uma tabela, através da execução de uma Stored Procedure, com base no resultado da XP_CMDShell —

— Exibindo as configurações avançadas —
EXEC sp_configure ‘show advanced options’, 1
Go

— Aplicando a alteração —
RECONFIGURE
Go

— Ativando o uso da XP_CMDShell —
EXEC sp_configure ‘xp_cmdshell’, 1
Go

— Aplicando a alteração —
RECONFIGURE
Go


Create Procedure P_RetornarIP @IP VarChar(25) Output
As
Begin

Set NoCount On

Declare @Auditoria2 Table
(Codigo Int Identity(1,1),
IP VarChar(2000))

Set RowCount 8

Insert Into @Auditoria2
exec master.dbo.xp_cmdshell ‘ipconfig’

Select @IP=(Select Replace(Substring(IP,CharIndex(‘:’,IP,1),25),’:’,”) from @Auditoria2
Where Codigo = 8)

End

Create Table Auditoria
(Codigo Int Identity(1,1),
HostName VarChar(20) Null)

Declare @IP VarChar(25)

Exec P_RetornarIP @IP OutPut
Insert Into Auditoria Values (@IP)

Select * from Auditoria
Go

— Exemplo 7 — Executando uma Instrução Transact-SQL através da XP_ExecResultSets —
Exec Master..XP_ExecResultSet ‘Select ”SP_help ””produtos”””’, ‘BancoDeDados’
Go

Exec Master..XP_ExecResultSet ‘Select ”Select * From produtos”’, ‘BancoDeDados’
Go


Muito bem, missão mais que cumprida!

Uma nova relação de short scripts acaba de ser compartilhada, mesmo sendo denominados shorts entre aspas “curtos ou pequenos”, posso garantir que todos estes exemplos são de grande importância, apresentam um valor e conhecimento do mais alto nível.

Chegamos ao final de mais um Short Scripts, espero que este material possa lhe ajudar, ilustrando o uso de alguns recursos e funcionalidades do Microsoft SQL Server.

Acredito que você tenha observado que estes códigos são conhecidos em meu blog, todos estão relacionados aos posts dedicados ao Microsoft SQL Server publicados no decorrer dos últimos anos.

Boa parte deste material é fruto de um trabalho dedicado exclusivamente a colaboração com a comunidade, visando sempre encontrar algo que possa ser a solução de um determinado problema, bem como, a demonstração de como se pode fazer uso de um determinado recurso.

Links

Caso você queira acessar os últimos posts desta sessão, não perca tempo acesse os links listados abaixo:

https://pedrogalvaojunior.wordpress.com/2020/02/05/8295/

https://pedrogalvaojunior.wordpress.com/2019/11/15/short-scripts-novembro-2019/

https://pedrogalvaojunior.wordpress.com/2019/09/11/short-scripts-setembro-2019/

https://pedrogalvaojunior.wordpress.com/2019/06/08/short-scripts-junho-2019/

https://pedrogalvaojunior.wordpress.com/2019/03/15/short-scripts-marco-2019/

Agradecimento

Obrigado mais uma vez por sua visita, fico honrado com sua ilustre presença ao meu blog, desejo e espero que você possa ter encontrado algo que lhe ajudou.

Volte sempre, nos encontraremos mais uma vez na sessão Short Scripts no post a ser publicado no mês de agosto em 2020.

Um forte abraço, saúde e paz.

Até mais.

Script Challenge – 16 – A resposta

Obtendo o histórico de consumo de CPU durante um intervalo de tempo em minutos….


Bom dia, bom dia, bom dia….

Tudo bem? Que bom te encontrar tão cedo por aqui….

Seja mais uma vez muito bem vindo ao meu blog, mais especificamente ao post que apresenta a resposta para o Script Challenge – 2019 – Post 16, sendo este respectivamente o quinto post após o retorno desta desafiadora sessão denominada Script Challenge (Script Desafiador ou Desafio do Script) como queiram traduzir.

Espero que você já tenha ouvido falar desta sessão ou acessado alguns dos posts publicados anteriormente. Caso ainda não tenha feito, fique tranquilo você vai encontrar no final deste post uma pequena relação contendo os últimos desafios lançados e seus respostas.

Vamos então falar um pouco mais sobre o último desafio, estou me referindo ao Script Challenge 16….


Script Challenge 16

Falando do desafio de número 16, o mesmo foi publicado no mês de outubro de 2019, período de data em que praticamente todos nós estamos começando a preparar para o encerramento do ano, as festas de final de ano estão se aproximando.

Da mesma forma que o início do ano não é algo muito fácil, o final também não, normalmente estamos no nosso limite físico, emocional, psicológico também, dos últimos dois meses parecem que duram o ano todo, mas não podemos nos abater e temos que serguir em frente, o mesmo foi feito aqui no meu blog.

Pois bem, o Script Challenge 16 possui um pouco relação ou conexão com toda esta loucura, não necessariamente com o natal ou final de ano, muito menos com presentes e toda aquela mesa farta com diversas comidas.

Na verdade, sabemos que existem determinadas situações, ações, procedimentos e demais atividades que se não cumprimos da maneira que estava preestabelecida acabamos de alguma forma sendo notificados ou até mesmo penalizados, pensando justamente desta forma, o Script Challenge 16 se relaciona.

Continuando nossa história, quero lhe perguntar: E ai já matou a charada? Acho que ainda não! Não é mesmo?

Para te ajudar mais um pouco vou apresentar a Figura 1 que contem todo código Transact-SQL utilizado neste desafio, contendo trechos ou partes de código ocultas, procedimento que realizei no post que contempla o lançamento deste desafio como forma de aumentar o nível de dificuldade:

Figura 1 – Código Transact-SQL apresentado no Script Challenge 16.

E ai, revendo novamente o código publicado no post de abertura deste desafio, você conseguiu checar a alguma conclusão?

Bom chegou a hora de revelar o que exatamente este bloco de código se propõem a fazer, chegou o momento de revelar e desvendar este desafio. A seguir apresento a resposta para o Script Challenge 16 e o todo bloco de código disponível para você utilizar em seus ambientes de trabalho ou estudos.

A resposta

Como você pode ter percebido, no decorrer deste post e também no post de lançamento, procurei de uma forma simples mas não explícita exibir ao longo do texto, pequenas dicas que poderiam ajudar, nortear e quem sabe indicar uma possível resposta ou solução para o desafio.

Falando mais diretamente, a resposta para o Script Challenge 16, esta totalmente relacionada as nossas atividades diárias, mas não no mundo real, mas sim no mundo virtual, estou me referindo ao histórico de tudo aquilo que fazemos durante um período ou intervalo de tempo, e foi pensando justamente neste tipo de situação que o Script Challenge 16 foi criado.

Mas se mesmo assim, você ainda não conseguiu adivinhar ou até mesmo pode estar se perguntando: Qual a relação do Script Challenge – 16 tem haver com histórico? A resposta para seu questionamento é muito simples, para qualquer Administrador de Banco de Dados, Administrador de Servidores, Desenvolvedor, enfim um profissional de tecnologia, tudo o que fazemos basicamente em um computador deve de alguma gerar dados históricos, gerar registros que evidenciam o que foi feito, quando, como, e até mesmo o porque, e como todos devem saber, um histórico nada mais é que uma relação de itens e ações registradas ao longo do tempo que ilustram de fato estes acontecimentos.

Então a resposta para o Script Challenge 16 se relaciona com a possibilidade que o script apresenta em nos ajudar a saber como foi o consumo de CPU utilizado em nosso servidor ou instância SQL Server durante um determinado intervalo de tempo, neste caso levando-se em consideração um período de tempo de 30 minutos, com intervalos pequenos do registro de histórico de processamento a cada um minuto.

Abaixo apresento o script original que ilustra esta capacidade que o Microsoft SQL Server em conjunto com suas visões e funções de gerenciamento dinâmico possui:

— Script Challenge 16 – A resposta – Realizando Auditoria em tempo real (In Live) —

DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info);
SELECT TOP(30)
               SQLProcessUtilization AS [SQL Server Process CPU Utilization],
               SystemIdle AS [System Idle Process],
               100 – SystemIdle – SQLProcessUtilization AS [Other Process CPU Utilization],
               DATEADD(ms, -1 * (@ts_now – [timestamp]), GETDATE()) AS [Event Time]
FROM (
              SELECT record.value(‘(./Record/@id)[1]’, ‘int’) AS record_id,
                           record.value(‘(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]’, ‘int’) AS [SystemIdle],
                           record.value(‘(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]’,’int’) AS [SQLProcessUtilization],
                           [timestamp]
FROM (
             SELECT [timestamp], CONVERT(xml, record) AS [record]
             FROM sys.dm_os_ring_buffers
             WHERE ring_buffer_type = N’RING_BUFFER_SCHEDULER_MONITOR’
             AND record LIKE N’%<SystemHealth>%’) AS x
            ) AS y
ORDER BY record_id DESC
Go

Então, agora você deve ter gostado deste desafio, não é verdade? Saber que existe a possibilidade de identificar como foi o consumo de CPU utilizado por nosso SQL Server durante um período de tempo, com certeza é algo que poderá nos ajudar muito a entender possíveis mudanças de comportamento em nosso ambiente.

Figura 2 apresentada abaixo, ilustra o conjunto de dados retornados após a execução do Script Challenge – 16:

Figura 2 – Histórico de execução e consumo de CPU.

Dentre o conjunto de colunas retornadas pelo Script Challenge 15, destaco algumas:

  • SQL Server Process CPU Utilization: Apresenta os valores relacionados a quantidade de CPU consumida pelo SQL Server de acordo com a linha de histórico retornada dentro do intervalo de tempo registrado. Esta coluna é gerada atráves processo Scheduler Monitor Event / System Health / Process Utilization, o qual é parte da camada do sistema operacional existente no SQL Server conhecido como SQLOS, em conjunto com o próprio sistema operacional e sua camada de monitoramento de eventos; e
  • Other Process CPU Utilization: Apresenta os valores relacionados a quantidade de CPU consumida por todos os outros serviços e recursos em execução de acordo com a linha de histórico retornada dentro do intervalo de tempo registrado. Esta coluna é gerada atráves do cálculo: 100 –
    SystemIdle – SQLProcessUtilization, onde a coluna SystemIdle é concebida através do processo Scheduler Monitor Event / System Health / System Idle, sendo este também pertencente parte da camada do sistema operacional existente no SQL Server.

Enfim, conseguimos, chegamos ao final, esta é a resposta para o Script Challenge 16, fico honrado, feliz por ter conseguido compartilhar este conteúdo com vocês.

Espero que você tenha gostado deste novo post da sessão Script Challenge!


Sua Participação

No post de lançamento deste desafio, contei com a sua participação através de uma enquete contendo algumas opções de respostas que poderiam estar relacionadas com o Script Challenge 16. A seguir apresento o resultado desta enquete:

A opção mais votada com 66% dos votos é justamente a resposta correta para este desafio: “O bloco de código apresentado se relacionado com a possibilidade de realizar o monitoramento do consumo cpu como parte dos processos e aplicações que estão acessando o SQL Server em um longo período de tempo.”

Referências

https://www.mssqltips.com/sqlservertip/1915/how-to-automatically-monitor-windows-event-log-from-sql-server/

https://docs.microsoft.com/en-us/sql/ssms/agent/monitor-and-respond-to-events

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-schedulers-transact-sql

https://www.mssqltips.com/sqlservertip/4403/understanding-sql-server-schedulers-workers-and-tasks/

https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/04/using-sys-dm_os_ring_buffers-to-diagnose-memory-issues-in-sql-server/

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-os-buffer-descriptors-transact-sql

https://gallery.technet.microsoft.com/SQL-Server-Monitoramento-ea6dd632

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sql-server-operating-system-related-dynamic-management-views-transact-sql

Posts anteriores

Caso esta seja a primeira vez que você acessa um post desta sessão, fico muito feliz e aproveito para compartilhar os posts mais recentes:

https://pedrogalvaojunior.wordpress.com/2019/10/26/script-challenge-2019-post-16/

https://pedrogalvaojunior.wordpress.com/2019/06/26/script-challenge-15-a-resposta/

https://pedrogalvaojunior.wordpress.com/2019/02/13/script-challenge-2019-post-15/

https://pedrogalvaojunior.wordpress.com/2018/10/06/script-challenge-14-a-resposta/

https://pedrogalvaojunior.wordpress.com/2018/06/29/script-challenge-2018-post-14/

Agradecimentos

Obrigado por sua visita, espero que este conteúdo aqui apresentado como um possível “desafio” possa ser útil e ao mesmo tempo prover conhecimento, aprendizado ou mostrar recursos e problemas existentes no Microsoft SQL Server que as vezes parecem não ter uma resposta.

Um forte abraço nos encontramos em breve nas demais sessões e especialmente em junho de 2020 em mais um post da sessão Script Challenge.

Até mais….

#28 – Para que serve

Utilizando o operador relacional Pivot em combinação com querys dinâmicas, funções Stuff(), String_Agg() e muito mais…..


Olá pessoal, boa tarde!!!

E aí, estão no ritmo do carnaval? Se for igual eu tenho a certo que não, particularmente eu não sou muito adepto desta tradicional festa brasileira e nos últimos anos considerada mundial, mesmo assim vou fazer uso dela na escrita deste post para ajudar você a se sentir na avenida.

Que bom saber que mesmo neste feriadão que estamos vivendo você está dando uma passadinha aqui no meu blog, espero que esta visita possa ser muito proveitosa e enriquecedora.

No post de hoje, vou demonstrar um dos mais tracionais operadores relacionais existente no Microsoft SQL Server adicionado a partir da versão 2005, que nos permite utilizar como expressões de Table-Valued (Tabela Valorizada) dentro de outra tabela. Tenho a certeza que em algum momento você já deve ter feito uso deste operador.

Continue Lendo “#28 – Para que serve”

Short Scripts – Fevereiro 2020

Neste primeiro post de 2020 da sessão Short Scripts, você vai encontrar 16 exemplos diferentes de como podemos criar em tempo de execução sequências numéricas de números inteiros.


Olá bom dia, como vai?

Seja bem-vindo, em mais um post da sessão Short Scripts, parece que foi então o último post publicado desta sessão e foi mesmo, já estamos em 2020.

Da mesma forma que post anterior publicado em 2019, este primeiro post dedicado ao Short Script também esta ocorrendo entre a madrugada do dia 04/02 e 05/02, as férias acabaram e com ela a volta ao batendo já se iniciou.

Mesmo com este horário meio fora do comum,são exatamente 00:25, isso mesmo, madrugada como já destaquei, que o post de número 40 desta tradicional sessão começa a sair do forno.

Mantendo a tradição estou retornando com mais um conjunto dos “curtos ou pequenos” scripts catalogados e armazenados em minha biblioteca pessoal de códigos relacionados ao Microsoft SQL Server e sua fantástica linguagem de desenvolvimento Transact-SQL.

Como promessa é dívida e deve ser cumprida “ou melhor” compartilhada, vou pagar a minha mais uma vez neste madrugada, feita no encerramento do post anterior publicado no mês de novembro em 2019, se por acaso você ainda não acessou o mesmo, calma, fique tranquilo, tudo vai dar certo, no encerramento deste post você terá a sua disposição a relação das últimas cinco publicações relacionadas aos Short Scripts.

Vamos caminhar mais um pouco então……..

O post de hoje

Para este post, não vou exatamente compartilhar um conjunto variado de scripts que foram catalogados nos últimos meses, ao contrário, vou disponibilizar um conteúdo que foi elaborado hoje, dedicado de forma única e exclusiva a demonstrar como podemos criar de diversas formas uma sequência numérica de números no Microsoft SQL Server, através de um mix de técnicas mais antigas em conjunto com funcionalidades e atuais.

Em conjunto com a sequência numérica, os exemplos de código aqui compartilhados se relacionam com os seguintes assuntos:

● Cláusula Where;
● Comando Begin;
● Comando Begin Transaction;
● Comando Case;
● Comando Commit Transaction;
● Comando Create Function;
● Comando Create Procedure;
● Comando Create Table;
● Comando Declare;
● Comando Distinct;
● Comando End;
● Comando Insert;
● Comando Insert;
● Comando Order By;
● Comando Select;
● Comando While;
● CTE;
● CTE Recursiva;
● Cursor;
● DataType Int;
● Declaração de Variáveis;
● Default Values;
● Diretiva Set;
● Diretiva Set NoCount;
● Função Concat();
● Função Try_Convert();
● Function;
● Junção Direta;
● Números Inteiros;
● Opção Identity();
● Operador Cross Join;
● Operadores compostos;
● Select Derivada;
● Select Values;
● Stored Procedure; e
● Subquery.

Chegou a hora, mãos nos teclados, a seguir apresento os códigos e exemplos selecionados para o Short Script – Fevereiro 2020. Vale ressaltar que todos os scripts publicados nesta sessão foram devidamente testados, mas isso não significa que você pode fazer uso dos mesmo em seu ambiente de produção, vale sim todo cuidado possível para evitar maiores problemas.

Fique à vontade para compartilhar, comentar e melhorar cada um destes códigos.


Short Scripts

— Exemplo 1 — While —
Set NoCount On
Go

Declare @NumeroInicial Int=1, @NumeroFinal Int=100

While @NumeroInicial <= @NumeroFinal
Begin

Select @NumeroInicial As Numeracao

Set @NumeroInicial +=1
End
Go

— Exemplo 2 — Insert Into Default Values + Go com número de recursividade —
Create Table TabelaNumeracao
(Numero Int Identity(0,2))

Insert Into TabelaNumeracao Default Values
Go 1000

Select * From TabelaNumeracao
Go

— Exemplo 3 — Cursor —
Declare @Contador Int=0, @NumeroAtual Int=0

Declare Cursor_Numeracao Cursor For
Select * From TabelaNumeracao
Order By Numero Desc

Open Cursor_Numeracao
While @Contador <= (Select Max(Numero) From TabelaNumeracao)
Begin

Fetch Next From Cursor_Numeracao
Into @NumeroAtual

Print Concat(‘O número atual é: ‘, @NumeroAtual)

Set @Contador +=2

End
Go

Close Cursor_Numeracao
Deallocate Cursor_Numeracao
Go

— Exemplo 4 — CTE Recursiva —
Declare @NumeroInicial Int=1, @NumeroFinal Int=100

;With CTENumeracaoSequencial (Numeracao)
As
(Select @NumeroInicial As Numero
Union All
Select 1+Numeracao As NumeroSequencial From CTENumeracaoSequencial
Where Numeracao < @NumeroFinal)

Select * From CTENumeracaoSequencial
Go

— Exemplo 5 — Multíplas CTE Recursivas —
;WITH CTEUm
As
(Select 1 As Um Union ALL SELECT 1)
,CTEUnidade
As
(Select 1 As Unidade From CTEUm C1, CTEUm C2)
,CTEDezena
As
(Select 1 As Dezena From CTEUnidade C1, CTEUnidade C2)
,CTECentena
As
(Select 1 As Centena From CTEDezena C1, CTEDezena C2)
,CTEMilhar
As
(Select 1 As Milhar From CTECentena C1, CTECentena C2)
,Numeracao
As
(Select ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as Numeracao From CTEMilhar)
Select * From Numeracao
Go

— Exemplo 6 — CTE com Operador de Junção Cross Join —
;With CTENumeracao (Numero)
As
(
Select * From
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoUnidade (NumeroUnidade)
)
Select Unidade.Numero+Dezena.Numero*10+Centena.Numero*100+Milhar.Numero*1000 As Numero
From CTENumeracao Unidade
Cross Join CTENumeracao Dezena
Cross Join CTENumeracao Centena
Cross Join CTENumeracao Milhar
Order By Numero
Go

— Exemplo 7 — CTE com Junção Cruzada Direta —
;With CTENumeracao (Numero)
As
(
Select * From
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoUnidade (NumeroUnidade)
)
Select Unidade.Numero+Dezena.Numero*10+Centena.Numero*100+Milhar.Numero*1000 As Numero
From CTENumeracao Unidade, CTENumeracao Dezena, CTENumeracao Centena, CTENumeracao Milhar
Order By Numero
Go

— Exemplo 8 — Objeto Sequence —
Create Sequence dbo.Numeracao As Int
Start With 1
Increment By 1
MinValue 1
MaxValue 5000
Cycle
Go

Select Next Value For dbo.Numeracao As NumeroLinha, Numero From TabelaNumeracao
Go

Alter Sequence dbo.Numeracao
Restart With 1
Go

— Exemplo 9 — Select com Função Row_Number() —
Select Row_Number() Over (Order By Numero) NumeroLinha,
Numero
From TabelaNumeracao
Go

— Exemplo 10 — Stored Procedure —
Truncate Table TabelaNumeracao
Go

Create Or Alter Procedure P_NumeracaoSequencial @NumeracaoSequencial Int
As
Set NoCount On

Declare @Contador Int=1

While @Contador <= @NumeracaoSequencial
Begin
Begin Transaction

Insert Into TabelaNumeracao With (TabLockX) Default Values

Commit Transaction

Set @Contador += 2
End
Go

— Executando —
Execute P_NumeracaoSequencial 100
Go

Select * From TabelaNumeracao
Go

— Exemplo 11 — User Defined Function —
Create Or Alter Function F_SequencialNumerica (@Numero Int=0)
Returns Table
Return
Select Unidade+Dezena*10+Centena*100+Milhar*1000 AS Numeracao From
(Select 0 AS Unidade Union Select 1 Union Select 2 Union Select 3 Union Select 4
Union Select 5 Union Select 6 Union Select 7 Union Select 8 Union Select 9) SequenciaUnidade,
(Select 0 AS Dezena Union Select 1 Union Select 2 Union Select 3 Union Select 4
Union Select 5 Union Select 6 Union Select 7 Union Select 8 Union Select 9 ) SequenciaDezena,
(Select 0 AS Centena Union Select 1 Union Select 2 Union Select 3 Union Select 4
Union Select 5 Union Select 6 Union Select 7 Union Select 8 Union Select 9 ) SequenciaCentena,
(Select 0 AS Milhar Union Select 1 Union Select 2 Union Select 3 Union Select 4
Union Select 5 Union Select 6 Union Select 7 Union Select 8 Union Select 9 ) SequenciaMilhar
Go

— Executando —
Select * From F_SequencialNumerica(0)
Where Numeracao=15
Go

— Exemplo 12 — Select … Values com Função Concat() e Operador de Junção Cross Join —
Select CONCAT(NumeroUnidade,NumeroDezena,NumeroCentena, NumeroMilhar) As ‘Caractere’,
(NumeroUnidade+NumeroDezena*10+NumeroCentena*100+NumeroMilhar*1000) As ‘Numerico’
From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoUnidade (NumeroUnidade)
Cross Join (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoDezena (NumeroDezena)
Cross Join (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoCentena (NumeroCentena)
Cross Join (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoMilhar (NumeroMilhar)
Order By ‘Numerico’
Go

— Exemplo 13 — Select … Values com Função Concat() e Junção Cruzada Direta —
Select CONCAT(NumeroUnidade,NumeroDezena,NumeroCentena, NumeroMilhar) As ‘Caractere’,
(NumeroUnidade+NumeroDezena*10+NumeroCentena*100+NumeroMilhar*1000) As ‘Numerico’
From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoUnidade (NumeroUnidade),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoDezena (NumeroDezena),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoCentena (NumeroCentena),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoMilhar (NumeroMilhar)
Order By Numerico
Go

— Exemplo 14 — Select … Values com Funções Try_Convert() e Concat() com Junção Cruzada Direta —
Select Try_Convert(Int, CONCAT(NumeroUnidade,NumeroDezena,NumeroCentena, NumeroMilhar),0) As ‘Numerico’
From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoUnidade (NumeroUnidade),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoDezena (NumeroDezena),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoCentena (NumeroCentena),
(Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As NumeracaoMilhar (NumeroMilhar)
Order By Numerico
Go

— Exemplo 15 — Select Tabela Derivada com Subquery Select … Values —
Select NumeroUnidade+NumeroDezena*10+NumeroCentena*100+NumeroMilhar*1000 As Numero
From
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroUnidade)) As Unidade,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroDezena)) As Dezena,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroCentena)) As Centena,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroMilhar)) As Milhar
Order By Numero
Go

— Exemplo 16 — Select Tabela Derivada com Função Convert() em conjunto com Select Tabela Derivada mais Subquery Select … Values —
Select Convert(Int, Numero) As Numero From
(
Select CONCAT(NumeroUnidade,NumeroDezena,NumeroCentena, NumeroMilhar) As Numero
From
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroUnidade)) As Unidade,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroDezena)) As Dezena,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroCentena)) As Centena,
(Select * From (Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) As Numeracao (NumeroMilhar)) As Milhar
) As Numeracao
Where Numero>0
Order By Numero
Go


Muito bem, missão mais que cumprida!

Uma nova relação de short scripts acaba de ser compartilhada, mesmo sendo denominados shorts entre aspas “curtos ou pequenos”, posso garantir que todos estes exemplos são de grande importância, apresentam um valor e conhecimento do mais alto nível.

Chegamos ao final de mais um Short Scripts, espero que este material possa lhe ajudar, ilustrando o uso de alguns recursos e funcionalidades do Microsoft SQL Server.

Acredito que você tenha observado que estes códigos são conhecidos em meu blog, todos estão relacionados aos posts dedicados ao Microsoft SQL Server publicados no decorrer dos últimos anos.

Boa parte deste material é fruto de um trabalho dedicado exclusivamente a colaboração com a comunidade, visando sempre encontrar algo que possa ser a solução de um determinado problema, bem como, a demonstração de como se pode fazer uso de um determinado recurso.

Links

Caso você queira acessar os últimos posts desta sessão, não perca tempo acesse os links listados abaixo:

https://pedrogalvaojunior.wordpress.com/2019/11/15/short-scripts-novembro-2019/

https://pedrogalvaojunior.wordpress.com/2019/09/11/short-scripts-setembro-2019/

https://pedrogalvaojunior.wordpress.com/2019/06/08/short-scripts-junho-2019/

https://pedrogalvaojunior.wordpress.com/2019/03/15/short-scripts-marco-2019/

https://pedrogalvaojunior.wordpress.com/2018/11/20/short-scripts-novembro-2018/

Agradecimento

Obrigado mais uma vez por sua visita, fico honrado com sua ilustre presença ao meu blog, desejo e espero que você possa ter encontrado algo que lhe ajudou.

Volte sempre, nos encontraremos mais uma vez na sessão Short Scripts no post a ser publicado no mês de abril em 2020.

Um forte abraço, saúde e paz.

Até mais.

Dica do Mês – Concatenando a relação de municípios por Estados através do uso da função Stuff()


Bom dia, boa tarde, boa noite…. Olá pessoal!

Tudo bem? Estou de volta neste finalzinho de férias de começo de ano, com mais um post da sessão Dica do Mês. Você já está preparado para volta as aulas?

Com certeza, todo meu planejamento de atividades, provas, exercícios, seminários, entre outros estão prontos, dediquei os primeiros dias deste mês de janeiro justamente para isso, gosto de me antecipar justamente para ter tempo hábil caso seja necessário fazer alguma alteração.

A primeira dica do mês de 2020 não se relaciona com volta as aulas, na verdade ela surgiu nos últimos dias devido a um estudo que estou fazendo para minha dissertação de mestrado, algo que ainda se encontra meio nebuloso na minha cabeça.

Venho desde o ano de 2017 acompanhando mudanças climáticas nas regiões, estados e municípios do nosso Brasil, o que me fez em 2018 montar um ambiente de estudo com dados reais e hipotéticos para aplicar alguns modelos matemáticos afim de obter dados que possam ser estudados em relação as queimadas ocorridas em pontos específicos.

Dentre estes dados armazenados tenho uma tabela que contempla um pequeno cadastro de Estado, Municípios e Regiões que utilizo em um outro ambiente de Data Warehouse, com base, na metodologia ROLAP (Relational On Line Analitical Processing), técnica que possibilita construir uma estrutura baseada no conceito relacional aplicada a forma de processamento analítica.

Foi baseado mais uma vez neste cenário, em conjunto com os estudos que constantemente venho fazendo que elaborei a ideia para ser apresentada neste post, o qual tem o objetivo básico de demonstrar como podemos fazer uso da função para trabalhar com caracteres string Stuff() existente no Microsoft SQL Server 2008 como podemos concatenar para cada linha de Estados armazenados em minha respectiva tabela a sua lista de municípios, em adicional a quantidade de municípios existentes nesta relação de acordo com o respectivo estado.

Desta forma, sem mais delongas, espero conseguir mitigar a sua curiosidade e apresentar algo interessante. Seja bem-vindo ao post – Dica do Mês – Concatenando a relação de municípios por Estados através do uso da função Stuff().

Continue Lendo “Dica do Mês – Concatenando a relação de municípios por Estados através do uso da função Stuff()”

#27 – Para que serve

Entenda como podemos renomear fisicamente o nome dos arquivos que compõem nosso banco de dados sem correr riscos.


Salve galera, boa tarde!

Tudo bem? Que bom poder te encontrar novamente aqui no meu blog. Este é o post de número 27 da sessão Para que serve, o último dedicado exclusivamente a ela neste ano de 2019.

No post de hoje, vou compartilhar uma das mais arriscadas atividades que um DBA ou Administrador de Banco de Dados pode se deparar em ter que executar em suas atividades.

Talvez você nunca tenha tido a necessidade de executar tal procedimento, mas é sempre bom estar preparado para qualquer necessidade, principalmente em momento de possíveis manutenções em seu ambiente que podem surgir inesperadamente.

De forma direta, vou apresentar como podemos através da linguagem Transact-SQL em conjunto com os recursos de Sistema de Arquivos (File System) alterar as configurações de nossos bancos de dados, mais diretamente relacionada aos arquivos que estão sendo utilizados em um especifico banco de dados.

Você pode estar se perguntando, mas qual é a configuração que você está se referindo Galvão? A resposta como costume de forma simples e direta: “Ao nome dos arquivos que estão sendo utilizados pelo banco de dados, no nosso cenário ao arquivo de log.”

Quem nunca por alguma necessidade técnica, regra de negócio ou até mesmo erro no momento da criação do seu banco de dados, criou os arquivos com nomes ou extensões fora dos padrões utilizados.

Sendo assim, chegou a hora de conhecer um pouco mais sobre o post de número 25 da sessão Para que serve. Mas uma vez, bem-vindo ao #27 – Para que serve – Renomeando fisicamente os nomes dos arquivos que compõem um banco de dados sem correr riscos.

Espero que você esteja animado para conhecer este procedimento, caso já conheça, continue lendo este post, sempre podemos aprender algo novo….

Introdução

Todo o banco de dados SQL Server tem, no mínimo, dois arquivos de sistema operacional: um arquivo de dados e um arquivo de log.

Os arquivos de dados contêm dados e objetos como tabelas, índices, procedimentos armazenados e exibições, estes arquivos de dados podem ser agrupados em grupos de arquivos para propósitos de alocação e administração.

Os arquivos de log contêm as informações necessárias para recuperar todas as transações no banco de dados.

Estes arquivos de banco de dados do SQL Server possuem diversas propriedades, dentre eles dois nomes: um é o nome lógico do arquivo e o outro é o nome do arquivo físico.

O nome do arquivo lógico é usado com alguns comandos T-SQL, como DBCC Shrinkfile. O nome do arquivo de banco de dados físico é o nome do arquivo real criado em seus diretórios do sistema operacional durante a criação do banco de dados. O SQL Server não exige manter nomes de arquivos lógicos exclusivos em uma instância de servidor SQL, mas, idealmente, devemos mantê-los únicos para evitar qualquer confusão.

Quando restauramos um banco de dados, os nomes lógicos dos arquivos do banco de dados não mudam e são os mesmos que o banco de dados de origem. Então, se você estiver restaurando vários bancos de dados com o mesmo arquivo de backup, os nomes de arquivos lógicos serão os mesmos para todos os bancos de dados restaurados.

Se você quiser alterar os nomes de arquivos lógicos de seus arquivos de banco de dados, então está post poderá lhe ajudar.

Através deste post, vou demonstrar um dos possíveis métodos que podem ser utilizados para mudar o nome de um arquivo de banco de dados físico usando o método de desapego com comandos T-SQL.

Recomendações: Este procedimento deve ser realizado em ambientes de testes e desenvolvimento, sempre acompanhado da execução de um backup antes de qualquer tipo de alteração. Você vai notar que estarei utilizando o comando Alter Database acompanhado da instrução With Rollback Immediate, a qual é de extrema importância, pois em caso de alguma falha na alteração das configurações, o SQL Server reverterá imediatamente a mudança que estava sendo aplicada e voltará para o estado anterior de funcionamento.

Continue Lendo “#27 – Para que serve”