Script Challenge – 13 – A resposta….


Salve pessoal, bom dia.

Tudo bem?  Seja mais uma vez muito bem vindo ao meu blog, mais especificamente ao post que apresenta a resposta para o Script Challenge – 2017, publicado em outubro de 2017 destacando o retorno da sessão 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 na mesma, 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 13, sendo assim, seja bem vindo a mais um post da sessão Script Challenge.


Script Challenge 13

Falando do desafio de número 13, o mesmo foi publicado no mês de outubro de 2017, período de data que apresenta uma das comemorações mais importantes que ocorrem anualmente em quase todos os países do mundo, mas que especialmente no Estados Unidos da América.

E ai já matou a charada? Eu acredito que sim! Mas 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 13.

Bom chegou a hora de revelar o que exatamente este pequeno bloco de código esta fazendo, chego o momento de revelar e desvendar este desafio, a seguir apresento a resposta para o Script Challenge 13 e o trecho de código disponível para você utilizar em seus ambientes de trabalho ou estudos.

A resposta

Tanto no post de lançamento do desafio, bem como, neste post de apresenta a resposta para o mesmo, eu deixei algumas pequenas dicas para tentar ajudar a identificar a resposta, dentre as quais a relação do script com uma das datas comemorativas mais tradicionais dos Estados Unidos, neste caso o Halloween(conhecido tradicionalmente como dia das bruxas).

Mesmo assim você pode estar se perguntando, o que Script Challenge 13 tem haver com dia das bruxas, ué tudo haver, pois quando falamos de bruxas, temos também em mente a relação com magia, fantasias, medo, terror e propriamente a fantasmas, isso mesmos fantasmas, algo que também pode acontecer em nossas tabelas com o passar do tempo conforme vamos realizando as manipulações de dados, torna-se possível se deparar com a ocorrência de possíveis dados fantasmas.

Então a resposta para o Script Challenge 13 é justamente a possibilidade que o script apresenta em identificar uma possível ocorrência de dados fantasmas em nossas tabelas e bancos de dados.

Isso mesmo, esta é a resposta e o script original que apresenta esta funcionalidade apresenta abaixo:

— Script Challenge 13 – A resposta – Identificando a ocorrência de dados fantasmas —

SELECT db_name(database_id),
                object_name(object_id),
                ghost_record_count,
                version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’),
                                                                            OBJECT_ID(N’GhostTable’),
                                                                            NULL,
                                                                            NULL ,
                                                                            ‘DETAILED’)
GO

Que coisa de louco isso Galvão! Sim realmente parece ser coisa de outro mundo, mas podem acontecer tranquilamente a qualquer momento, o complicado é imaginar, que nossos bancos de dados, podem ser vítimas deste tipo de situação.

Mas isso não é o fim do mundo, muito ao contrário, para este cenário temos uma grande vantagem. Você pode estar se perguntando qual, a resposta é simples, não precisamos chamar os Casas Fantasmas, nós mesmos podemos resolver facilmente isso. Foi pensando justamente nas possibilidades da ocorrência deste tipo de situação, que além da compartilhar a resposta para este desafio, vou deixar também um cenário de simulação de como é possível ocorrência a existência de dados fantasmas, como também a possibilidade de excluir estes “dados”, a seguir:

— Simulando a ocorrência de dados fantasmas —

— Criando o Banco de Dados – GhostDB —
Create Database GhostDB
Go

— Acessando o Banco de Dados —
Use GhostDB
Go

— Criando a Tabela GhostTable —
Create Table GhostTable
(GhostRecord Int)
Go

— Criando um índice clusterizado —
Create Clustered Index Ind_GhostTable_GhostRecord On GhostTable(GhostRecord)
Go

— Inserindo Dados na Tabela GhostTable —
Insert Into GhostTable
Select 100
Go

— Obtendo informações sobre as estatísticas de alocação de dados —
Select object_id,
index_id,
index_depth,
index_level
From sys.dm_db_index_physical_stats(db_id(),
object_id(‘GhostTable’),
object_id(‘Ind_GhostTable_GhostRecord’),
null,
null)
Go

— Obtendo informações sobre o Índice IND_GhostTable_GhostRecord —
Select id, name, root, first
from sys.sysindexes
where id=565577053 — Aqui você vai colocar o ID identificado do índice apresentado na sua máquina —
Go

— Identificando a página de dados que contem os dados inseridos na GhostTable —
SELECT first_page,
(convert(varchar(2), (convert(int, substring(first_page, 6, 1)) * power(2, 8)) +
(convert(int, substring(first_page, 5, 1)))) + ‘:’ + convert(varchar(11),
(convert(int, substring(first_page, 4, 1)) * power(2, 24)) +
(convert(int, substring(first_page, 3, 1)) * power(2, 16)) +
(convert(int, substring(first_page, 2, 1)) * power(2, 8)) +
(convert(int, substring(first_page, 1, 1))))) As Page
FROM SYS.SYSTEM_INTERNALS_ALLOCATION_UNITS
Where first_page = 0x180100000100 — Valor obtido no bloco de código anterior através da coluna root —
Go

— Habilitando a Trace Flag 3604 para apresentar informações sobre as páginas de dados —
DBCC TRACEON (3604)
GO

— Consultando informações sobre as páginas de dados relacionadas o índice Ind_GhostTable_GhostRecord —
DBCC PAGE(GhostDB,1,280,1)
Go

Após obter o resultado do DBCC Page procure pela coluna m_ghostRecCnt, neste momento ela deve esta apresentando o valor m_ghostRecCnt = 0.

— Excluíndo os registros em GhostTable —
Delete from GhostTable
Where GhostRecord=100
Go

— Consultando informações sobre as páginas de dados relacionadas o índice Ind_GhostTable_GhostRecord —
DBCC PAGE(GhostDB,1,280,3)
Go

Agora verifique novamente a coluna m_ghostRecCnt que neste momento deverá apresentar o valor igual á m_ghostRecCnt = 1, este é o indicador da ocorrência de um dado fantasma em nossa tabela.

— Confirmando a existência de um registro fantasmas —
SELECT db_name(database_id),
object_name(object_id),
ghost_record_count,
version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’), OBJECT_ID(N’GhostTable’), NULL, NULL , ‘DETAILED’)
GO

— Simulando a eliminação de dados fantasmas —
Alter Table GhostTable
Rebuild — Utilize este tipo de procedimento em uma tabela com poucos registros —
Go

— Confirmando a existência de um registros fantasmas —
SELECT db_name(database_id),
object_name(object_id),
ghost_record_count,
version_ghost_record_count
FROM sys.dm_db_index_physical_stats(DB_ID(N’GhostDB’),
OBJECT_ID(N’GhostTable’),
NULL,
NULL ,
‘DETAILED’)
GO

— Liberando espaço alocado anteriormente em disco pelos registros fantasmas —
Exec sp_clean_db_free_space @dbname=N’GhostDB’
Go

Meu deus, conseguimos, chegamos ao final, esta é a resposta para o Script Challenge 13, sinceramente falando achei que não iria conseguir compartilhar este conteúdo com vocês.

Espero que tenham gostado desta da volta desta sessão, como também, a nova maneira que pretendo apresentar os desafios e seus respostas.


Sua Participação

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

Referências

Agradecimentos

Obrigado por sua visita, espero que o retorno desta sessão e o conteúdo aqui apresentado como um possível “desafio” possam ser úteis 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 2018 em mais um post da sessão Script Challenge.

Até a próxima…

Anúncios

Short Scripts – Fevereiro 2018 – Transaction Log


Olá, bom dia, mais uma semana começando….

E você já esta aqui acessando o meu blog, que alegria poder te encontrar em mais um post da sessão Short Scripts, uma das sessões mais recentes do meu blog que esta alçando a marca de 32 posts, sendo estes publicados trimestralmente.

Mantendo a tradição estou retornando com mais um conjunto de “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.

Mas como este é o primeiro post desta sessão em 2018, farei algo um pouco diferente, você terá uma pequena surpresa.

Desejo que o conteúdo aqui compartilhado possa lhe ser útil, como também sirvo de referência e sugestões para novas formar de resolução de problemas e aprendizado.

Vamos então conhecer um pouco mais sobre este novo post….

O post de hoje

Como já destacado no início do post, ao invés de compartilhar os últimos scripts adicionados a  minha biblioteca, quero dividir com você um conteúdo dedicado especificamente a um assunto muito importante quando nos referimos ao Microsoft SQL Server, mais especificamente ao Transaction Log (Log de Transações), funcionalidade presente em todos os bancos de dados criados em qualquer versão e edição do SQL Server.

E ai que você achou desta surpresa, gostou? Eu gostei, não é fácil você conseguir encontrar em um único local um conteúdo focado exclusivamente a este assunto tão importante, que muitos profissionais que trabalham com banco de dados até hoje não conseguem entender o conceito e forma de atuação do Transaction-Log.

Seguindo em frente, a seguir apresento os códigos e exemplos selecionados para o Short Script – Fevereiro 2018 – Transaction Log. 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.

Short Scripts

Fique a vontade para compartilhar, comentar e melhorar cada um destes códigos:

— Short Script 1 – Log Record —

— Altera o Recovery Model para SIMPLE
ALTER DATABASE AdventureWorks2016
SET RECOVERY SIMPLE
Go

— Truncar o Transaction Log —
CHECKPOINT
Go

— Conteúdo do log – todas as colunas —
USE AdventureWorks2016
Select * from ::fn_dblog(null, null)
Go

–update
Begin Transaction

UPDATE dbo.Pessoa
SET nome = ‘XUXA’
Where ID=3

Rollback
Go

— Conteúdo armazenado no Log File —
Select [Current LSN],
Operation,
Context,
[Transaction ID],
[Log Record Length],
[Previous LSN],
AllocUnitName,
[Page ID],
[Slot ID],
[Checkpoint Begin],
[Checkpoint End],
[Minimum LSN],
SPID,
[Begin Time],
[Transaction Name],
[Parent Transaction ID],
[Lock Information],
Description,
[RowLog Contents 0],
[RowLog Contents 1],
[Log Record]
From ::fn_dblog(null, null)
Go

— DBCC SQLPERF —
DBCC SQLPERF(LOGSPACE)
Go

— Short Script 2 – CheckPoint —

— Criando a Base de Dados —
CREATE DATABASE DemoCheckpoint
ON PRIMARY
(NAME = ‘DemoCheckpoint_data’,
FILENAME = ‘D:\MSSQL\DemoCheckpoint_data.mdf’)
LOG ON
(Name = ‘DemoCheckpoint_Log’,
FILENAME = ‘D:\MSSQL\DemoCheckpoint_log.ldf’,
SIZE = 100MB,
FILEGROWTH = 10MB)
GO

— Alterando o Recovery Model —
ALTER DATABASE DemoCheckpoint
SET RECOVERY SIMPLE
Go

— Criando a Tabela Teste —
USE DemoCheckpoint
GO

CREATE TABLE Teste
(C1 varchar(50) NOT NULL,
C2 varchar(50) NOT NULL)
GO

— Forçando o Checkpoint —
CHECKPOINT
Go

— Abrir o Perfmon com os contadores

— em outra sessão
USE DemoCheckpoint
GO

WHILE 1=1
BEGIN

INSERT INTO dbo.teste
VALUES (‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’)
END

— Short Script 3 – Log Chain Simple —

— Iniciar nova sessão do Perfmon —
SELECT name, recovery_model_desc
FROM sys.databases
WHERE name = ‘AdventureWorks2016’
Go

— Alterar Recovery Model para Simple —
ALTER DATABASE AdventureWorks2016
SET RECOVERY SIMPLE
Go

— Abrir nova Query —
USE AdventureWorks2016
Go

WHILE 1=1
BEGIN
INSERT INTO dbo.pessoa
VALUES (‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’)
END

— Alterar Recovery Model para Full —
ALTER DATABASE AdventureWorks2016
SET RECOVERY FULL
GO

— Realizar Backup Database —
BACKUP DATABASE AdventureWorks2016
TO DISK = ‘d:\backupcompress.bak’
WITH COMPRESSION,
DIFFERENTIAL
GO

— Short Script 4 – DBCC LogInfo —

— Criando uma nova base de dados —
CREATE DATABASE TestDB
ON PRIMARY
(NAME = ‘TestDB_data’,
FILENAME = ‘D:\MSSQL\TestDB_data.mdf’)
LOG ON
(Name = ‘TestDB_Log’,
FILENAME = ‘D:\MSSQL\TestDB_log.ldf’,
SIZE = 10MB,
FILEGROWTH = 10MB)
GO

— Obtendo informações sobre a base de dados —
DBCC LOGINFO(TestDB)
Go

–Forçando o crescimento do Transact-Log manualmente em 20MB —
ALTER DATABASE TestDB
MODIFY FILE
(NAME = ‘TestDB_Log’,
SIZE = 20MB);
GO

— Obtendo informações sobre a base de dados —
DBCC LOGINFO(TestDB)
Go

— Short Script 5 – Natureza Circular —

— Alterando Recovery Model FULL —
ALTER DATABASE TestDB
SET RECOVERY FULL;
Go

— Realizando Backup Database —
BACKUP DATABASE TestDB
TO DISK = ‘D:\TestDB.bak’
Go

— Forçando o encolhimento do Transaction – Log —
DBCC LOGINFO(TestDB)
Go

BACKUP LOG TestDB
TO DISK = ‘bkplogTestDB.trn’
Go

USE TestDB
Go

DBCC SHRINKFILE (TestDB_Log,1)
Go

DBCC LOGINFO(TestDB)
Go

— Criando uma nova Tabela —
USE TestDB
GO

CREATE TABLE dbo.pessoa
(ID int identity PRIMARY KEY NOT NULL,
Nome varchar(50) NOT NULL,
Sobrenome varchar(50) NOT NULL,
Nascimento date NOT NULL,
Cargo varchar(50))
GO

— Abrir nova query —
USE TestDB
GO

WHILE 1=1
BEGIN
INSERT INTO dbo.pessoa
VALUES (‘Junior’, ‘Galvão’, ‘19800428’, ‘Database Administrator’)
END

— Monitorar o crescimento do log em tempo de execução —
DBCC LOGINFO(TestDB)

CHECKPOINT

SELECT name,
Log_reuse_wait_desc
FROM sys.databases
WHERE name = ‘TestDB’
Go

— Realizar Backup do Arquivo de Log —
BACKUP LOG TestDB TO DISK = ‘d:\log.trn’
Go

— Alterando Recovery Model para Full
ALTER DATABASE AdventureWorks2016
SET RECOVERY FULL
Go

— Realizando novo Backup Database —
BACKUP DATABASE AdventureWorks2016
TO DISK = ‘d:\backup.bak’
WITH COMPRESSION
Go

— Short Script 6 – Backup and Transaction Log —

— Preparando a base – 1m10s se não preparada na demo 5
ALTER DATABASE AdventureWorks2016 SET RECOVERY FULL
GO
BACKUP DATABASE AdventureWorks2016 TO DISK = ‘d:\backup.bak’ WITH COMPRESSION
GO

— Realizando Backup do Arquivo de Log —
BACKUP LOG AdventureWorks2016
TO DISK = ‘bkplog.trn’
Go

— Obtendo informações sobre o Log —
DBCC LOGINFO(AdventureWorks2016)
Go

— Encolhendo o Transaction Log —
USE AdventureWorks2016
Go

DBCC SHRINKFILE (AdventureWorks2016_Log,1)
Go

— Obtendo informações sobre o Log —
DBCC LOGINFO(AdventureWorks2016)
Go

— Ajustando o tamanho do Transaction Log —
USE AdventureWorks2016
Go

— Encolhendo o Transaction Log —
DBCC SHRINKFILE (AdventureWorks2016_Log,1)
Go

— Obtendo informações sobre o Log —
DBCC LOGINFO(AdventureWorks2016)
Go

— Modificando o arquivo de Log —
ALTER DATABASE AdventureWorks2016
MODIFY FILE
(NAME = AdventureWorks2016_Log,
SIZE = 4MB)
Go

— Encolhendo o Transaction Log —
DBCC LOGINFO(AdventureWorks2016)

— Abrir nova query —
BACKUP DATABASE AdventureWorks2016
TO DISK = ‘d:\backup.bak’
Go

— Abrir nova query —
USE AdventureWorks2016
GO

WHILE 1=1
BEGIN
INSERT INTO dbo.pessoa
VALUES (‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’),
(‘bbbbbbbbbbbbbbbbbbbb’, ‘bbbbbbbbbbbbbbb’)
END
Go

— Forçando o Truncate do Log —
BACKUP LOG AdventureWorks2016
TO DISK = ‘bkplog.trn’
Go

— Obtedo informações do arquivo de log —
DBCC LOGINFO(AdventureWorks2016)
CHECKPOINT
SELECT name,
log_reuse_wait_desc
FROM sys.databases
WHERE name = ‘AdventureWorks2016’
Go

— Ajustando o tamanho do TLog
USE AdventureWorks2016
GO

DBCC SHRINKFILE (AdventureWorks2016_Log,1)
GO

DBCC LOGINFO(AdventureWorks2016)
Go

— Short Script 7 – File Growth —

— Habilitando Trace Flags para evidênciar mudanças no Log —
DBCC TRACEON (3004, 3605, -1);
Go

— Limpar o log do SQL Server —
sp_cycle_errorlog
Go

— Criar uma nova Base de Dados —
CREATE DATABASE TransactionLog
ON PRIMARY
(NAME = ‘TransactionLog_data’,
FILENAME = ‘D:\MSSQLSERVER\DATA\TransactionLog_data.mdf’,
SIZE = 10240MB)
LOG ON
(Name = ‘TransactionLog_Log’,
FILENAME = ‘D:\MSSQLSERVER\DATA\TransactionLog_log.ldf’,
SIZE = 1024MB,
FILEGROWTH = 1024MB)
GO

— Identificar o tempo decorrido para processamento relacionado somente ao Log —
xp_readerrorlog
Go

— Desabilitando Trace Flags —
DBCC TRACEOFF (3004, 3605, -1);
Go

— Short Script 8 – Open Transaction in Tracking —

— Identificando as Transações abertas e seu respectivo consumo do Transaction Log —
SELECT
[s_tst].[session_id],
[s_es].[login_name] AS [Login Name],
DB_NAME (s_tdt.database_id) AS [Database],
[s_tdt].[database_transaction_begin_time] AS [Begin Time],
[s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
[s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
[s_est].text AS [Last T-SQL Text],
[s_eqp].[query_plan] AS [Last Plan]
FROM sys.dm_tran_database_transactions [s_tdt] Inner JOIN sys.dm_tran_session_transactions [s_tst]
ON [s_tst].[transaction_id] = [s_tdt].[transaction_id]
Inner JOIN sys.[dm_exec_sessions] [s_es]
ON [s_es].[session_id] = [s_tst].[session_id]
Inner JOIN sys.dm_exec_connections [s_ec]
ON [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN sys.dm_exec_requests [s_er]
ON [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
ORDER BY [Begin Time] ASC;
Go

É isso ai, missão cumprida! Mais uma relação de short scripts acaba de ser compartilhada, mesmo sendo denominados short entre aspas “pequenos”, posso garantir que todos estes exemplos são de grande importância, apresentam um valor e conhecimento do mais alto nível.

Quero agradecer ao amigo Luiz Mercante que colaborou com a criação e uso destes scripts em algumas palestras realizadas nos últimos anos no evento SQL Saturday.


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/2017/12/09/short-scripts-dezembro-2017/

https://pedrogalvaojunior.wordpress.com/2017/09/16/short-scripts-setembro-2017/

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

https://pedrogalvaojunior.wordpress.com/2017/03/31/short-scripts-marco-2017/

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 do mês de maio de 2018.

Sucesso….

Material de Apoio – Fevereiro 2018


Boa tarde.

Tudo bem? E ai esta curtindo o carnaval?

Espero que sim, eu estou aqui mais uma vez procurando colaborar e compartilhar com a comunidade técnica em mais um post dedicado exclusivamente ao meu blog. Fico feliz em encontrar você aqui fazendo mais uma visita ao meu blog, neste feriado, espero que tenha gostado do conteúdo aqui encontrado.

O post de hoje

 

Seja bem-vindo a mais um post da sessão Material de Apoio, sendo o primeiro do ano de 2018 e de número 155 no total desta sessão.

Para aqueles que já acompanham o meu blog a um certo tempo, os posts dedicados a sessão Material de Apoio, possuem o objetivo de compartilhar o conhecimento de recursos, funcionalidades e procedimentos que podemos realizar no Microsoft SQL Server.

Hoje não será diferente, estou trazendo alguns dos mais recentes scripts  catalogados nos últimos meses, que atualmente estão compondo a minha galeria de códigos formada ao longo dos anos de trabalho como DBA e atualmente como Professor de Banco de Dados.

Neste post você vai encontrar arquivos relacionados com os seguintes temas:

  • Armazenamento de arquivos;
  • Cláusula Values;
  • Comando Select;
    Comando Top;
  • Endereço de e-mails;
  • Excel;
  • Grant All Permissions;
  • Impactos na Ordenação de dados;
  • Índices;
  • Ordenação de Colunas;
  • Passwords;
  • Performance;
  • Random Character;
  • Tabelas;
  • User Defined Function; e
  • Validação de dados.

Espero que este conteúdo possa lhe ajudar em seus atividades profissionais e acadêmicas. Por questões de compatibilidade com a plataforma WordPress.com, todos os arquivos estão renomeados com a extensão .doc ao final do seu respectivo nome, sendo assim, após o download torna-se necessário remover esta extensão, mantendo somente a extensão padrão .sql.

Material de Apoio

A seguir apresento a relação de arquivos  selecionados:

1 – Material de Apoio – Fevereiro 2018 – Realizando a validação de endereços de e-mail.sql

2 – Material de Apoio – Fevereiro 2018 – Impacto na Ordenação de Colunas em Índice – Comandos DML.sql

3 – Material de Apoio – Fevereiro 2018 – Generating A Password in SQL Server with T-SQL from Random Characters.sql

4 – Material de Apoio – Fevereiro 2018 – Simple SQL Server Function to Generate Random 8 Character Password.sql

5 – Material de Apoio – Fevereiro 2018 – Comando Select em conjunto com comando Top e cláusula Values.sql

6 – Material de Apoio – Fevereiro 2018 – Atribuindo Grant All para todas as tabelas.sql

7 – Material de Apoio – Fevereiro 2018 – Como armazenar arquivos do Excel diretamente no SQL Server.sql

Fique a vontade para copiar, editar, compartilhar e distribuir estes arquivos com seus contatos, aproveite se possível deixe seu comentário, críticas, sugestões e observações.

Nota: Todos os arquivos disponibilizados foram obtidos ou criados com autorização de seus autores, sendo estes, passíveis de direitos autorais.

Links

Caso você queira acessar os posts anteriores da sessão, não perca tempo utilize os links listados abaixo:

https://pedrogalvaojunior.wordpress.com/2017/11/04/material-de-apoio-novembro-2017/

https://pedrogalvaojunior.wordpress.com/2017/08/08/material-de-apoio-agosto-2017/

https://pedrogalvaojunior.wordpress.com/2017/05/09/material-de-apoio-maio-2017/

Agradecimento

Quero agradecer imensamente a sua visita, ainda mais hoje neste feriadão prolongado de carnaval.

Não deixe de acessar os outros posts das demais sessões, o próximo post desta sessão será publicado no mês de abril, até lá continue curtindo sua vida e compartilhando suas experiência.

Até a próxima, sucesso….

Dica do Mês – SQL Setup ToolSuite Introduction


Olá pessoal, muito boa tarde.

Tudo bem? Mais um dia de fortes chuvas aqui em São Roque e região, ainda bem que a internet até o presente  momento esta funcionando de forma razoável(é bom não elogiar muito)….

Estou retornado neste início de 2018 conforme prometido no último post da sessão Dica do Mês em 2017 com mais um post exclusivo desta sessão, daa mesma forma que o anterior apresentando algo diferente relacionado ao Microsoft SQL Server.

Neste post, quero compartilhar um conteúdo fresquinho que acabou de sair do forno, na verdade que acaba de ser liberado pelo time de engenheiros do Microsoft SQL Server dedicados exclusivamente ao suporte e desenvolvimento de soluções para o produto, conhecidos mundial como CSS SQL Server EngineersOfficial team Web Log for Microsoft Customer Service and Support (CSS) SQL Support. Caso você ainda não os conheça, não perca tempo acesse: https://blogs.msdn.microsoft.com/psssql/.

Continuando com o post, este fantástico time de profissionais mantidos pelo Microsoft esta a cada dia implementando novas soluções que nos permitem administrar, gerenciar e soluções problemas que o Microsoft SQL Server poderá apresentar em qualquer uma das atuais versões disponibilizadas nos últimos anos. Pensando justamente neste tipo de cenário o CSS SQL Server Engineers acabam de compartilhar uma nova suíte chamada de SQL Setup ToolSuite Introduction.

Ficou curioso em saber um pouco mais sobre esta nova suíte? Então vamos em frente, vou tentar matar a sua curiosidade. Sendo assim, seja bem vindo ao post – Dica do Mês – SQL Setup ToolSuite Introduction.

Você vai conhecer um pouco sobre esta suíte e suas ferramentas…


SQL Setup ToolSuite Introduction (1) – FixMissingMSI

Se você encontrou problemas de MSI/MSP armazenados em cache durante a instalação do SQL Server, você pode ter acessado o artigo: Como restaurar os arquivos de cache do Windows Installer ausentes e resolver problemas que ocorrem durante uma atualização do SQL Server. 

Pensando justamente neste cenário que o time do CSS desenvolveu esta ferramenta, sendo esta uma solução para contornar este tão frequente comportamento apresentado pelo setup de instalação do Microsoft SQL Server. A Figura 1 ilustra a tela da FixMissingMSI, clique na própria figura para realizar o download:Figura 1 – SQL Suíte ToolSetup Introduction – FixMissingMSI.

SQL Setup ToolSuite Introduction (2) – Product Browser

Através desta simples e prática ferramenta, temas a capacidade de obter informações sobre todos os produtos relacionados ao Microsoft SQL Server instalados em sua máquina, dentre elas local de instalação, patch, versão entre outras.

A Figura 2 abaixo ilustra a tela do Product Browser, clique na própria figura para realizar o download:

Figura 2 – SQL Suíte ToolSetup Introduction – Product Browser.

SQL Setup ToolSuite Introduction (3) – SQL Registry Viewer

Você pode querer saber quais chaves do registro serão adicionadas ao sistema para uma instalação do SQL Server. Se você usar alguma ferramenta de snapshot do registro para comparar a mudança de registros de janela antes e depois da instalação do SQL você vai encontrar há 40.000 ~ 60000 modificações acontecendo.

No entanto, se você estudar as modificações com cuidado você vai descobrir que a maioria deles não tem muito sentido, por exemplo, muitas modificações vão para HKLM\DRIVERS\DriverDatabase\DeviceIds\ entrada. As modificações mais interessantes são:

<>Installer related registry keys under
HKEY_CLASSES_ROOT\Installer and
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18

<>COM+ related,Like
Computer\HKEY_CLASSES_ROOT\CLSID
Computer\HKEY_CLASSES_ROOT\Interface
Computer\HKEY_CLASSES_ROOT\TypeLib

<> SQL specific
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

<>Service
WOW6432Node

Agora com o SQL Registry Viewer, você poderá obter facilmente todo este conjunto de dados armazenados no registro do Windows, relacionados ao Microsoft SQL Server e seus componentes. A Figura 3 a seguir apresenta a tela desta excepcional ferramenta:

Figura 3 –  SQL Suíte ToolSetup Introduction – SQL Registry Viewer.

E ai gostou destas novas ferramentas que fazem parte da SQL Setup ToolSuite Introduction? Posso lhe dizer que gostei muito, já realizei o download e testei em minhas máquinas físicas e virtuais, mas vou confessar de todas elas a que eu mais gostei foi a SQL Registry Viewer. E você?

Quer deixar a sua opinião? Compartilhar a sua preferência?

Então vote na enquete abaixo escolhendo a ferramenta que mais você gostou e acredita que poderá lhe ajudar mais:

Sensacional, show, chegamos ao final de mais um post da sessão Dica do Mês, espero que você tenha gostado, com certeza estas novas ferramentas desenvolvidas pelo CSS SQL Server Engineers poderão lhe ajudar muito em suas atividades diárias.


Referências

https://blogs.msdn.microsoft.com/psssql/2018/01/24/sql-setup-toolsuite-introduction-1-fixmissingmsi/

https://blogs.msdn.microsoft.com/psssql/2018/01/24/sql-setup-toolsuite-introduction-2-product-browser/

https://blogs.msdn.microsoft.com/psssql/2018/01/24/sql-setup-toolsuite-introduction-3-sql-registry-viewer/

Posts Anteriores

https://pedrogalvaojunior.wordpress.com/2017/11/01/dicadomessql2017novascolunasinternas/

https://pedrogalvaojunior.wordpress.com/2017/08/26/dica-do-mes-simulando-a-insercao-de-uma-massa-de-dados-aleatoria/

https://pedrogalvaojunior.wordpress.com/2017/05/23/conhecendo-e-aplicando-o-uso-de-atualizacao-de-estatisticas-incrementais/

https://pedrogalvaojunior.wordpress.com/2017/04/13/dica-do-mes-microsoft-sql-server-identificando-as-transacoes-que-estao-utilizando-o-transact-log/

Conclusão

Falar, compartilhar informações, e um pouco do meu conhecimento sobre o Microsoft SQL Server é algo que me da um imensão prazer e satisfação. Mas saber que existe um time de profissionais focados diariamente na evolução, correções e melhorias do produto é um sentimento que faz a cada dia saber que tomei a decisão certa em meados do ano 2000, quando resolvi mudar totalmente a minha carreira e se dedicar exclusivamente a este produto e todo o seu conjunto de ferramentas, componentes, recursos e soluções.

Estas três novas ferramentas, são um pequeno pedaço existente do lado externo do Microsoft SQL Server que nos permite entender e analisar a grandeza do produto, não somente na sua capacidade de processamento e armazenamento de dados, mas sim no seu real tamanho, proporção de soluções e possibilidades de se contornar, corrigir e mitigar qualquer possibilidade de falha, perda de performance ou um simples erro durante o processo de instalação.

Foi pensando justamente neste cenário que estas novas ferramentas que formam a SQL Setup ToolSuite Introduction nos permite fazer, colentando informações de chaves de registro ou até mesmo identificar produtos instalados em nossas máquinas relacionados a o SQL Server.

Parece ser simples isso! Na verdade é algo muito além de um simples editor de texto para se montar uma query, é justamente um ambiente SGBD. Este é o universo do Microsoft SQL Server, criado a muito anos que esta sempre evoluindo, passando por transformações sem perder a sua essência.

Para os demais produtos que acreditam fazer o mesmo que ele, eu digo, sinto muito.

Agradecimentos

Quero deixar um agradecimento especial ao Team CSS SQL Server Engineers, profissionais do mais alto escalão e nível técnico, que a cada dia nos ajudam a conhecer e desvendar os diversos mistérios existentes nas versões e edições do Microsoft SQL Server.

Agora agradeço a você por sua atenção e visita ao meu blog. Fique a vontade para enviar suas críticas, sugestões, observações e comentários.

Um forte abraço, nos encontramos no próximo post a ser publicado no mês de março.

Vai SQL Server, Vai SQL Server…..

Sucesso e até mais.

Microsoft SQL Server Data Tools v15.5.1 para Visual Studio 2017 disponível


O SQL Server Data Tools v15.5.1 é uma ferramenta de desenvolvimento moderna que você pode baixar gratuitamente para criar bancos de dados relacionais do SQL Server, bancos de dados SQL do Azure, pacotes do Integration Services, modelos de dados do Analysis Services e relatórios do Reporting Services.

Com o SSDT, você pode projetar e implantar qualquer tipo de conteúdo do SQL Server com a mesma facilidade com que desenvolve um aplicativo no Visual Studio.

O SQL Server Data Tools v15.5.1 para Visual Studio 2017 está disponível para download aqui e é compatível com o Windows 7 SP1, Windows 8.1, Windows 10, Windows Server 2012 R2 e Windows Server 2016.

SQL Server Data Tools v15.5.1 para Visual Studio 2017Esta versão do SSDT pode ser instalada nos seguintes idiomas:

Chinês (República Popular da China) | Chinês (Taiwan) | Inglês (Estados Unidos) | Francês | Alemão | Italiano | Japonês | Coreano | Português (Brasil) | Russo | Espanhol

De acordo com o changelog, esta versão traz a correção de um problema no qual o instalador trava na pós-instalação do SQL Server Integration Services e a correção de um problema no qual a instalação falha com a seguinte mensagem de erro: “Não há suporte para a operação de metarquivo solicitada (0x800707D3)”.

IMPORTANTE: Antes de instalar o SSDT v15.5.1 para Visual Studio 2017, desinstale as extensões “Projetos do Microsoft Analysis Services” e “Projetos do Microsoft Reporting Services”, caso eles já estejam instalados no VS 2017 e feche todas as instâncias do VS.

Mais informações sobre o SQL Server Data Tools podem ser encontradas aqui. Ele também possui uma versão para o Visual Studio 2015.

Fontes e Direitos Autorais: https://docs.microsoft.com/pt-br/sql/ssdt/changelog-for-sql-server-data-tools-ssdt

Microsoft disponibiliza atualização cumulativa 9 para SQL Server 2014 SP2


A Microsoft disponibilizou para download nesta semana a Atualização Cumulativa 9 para SQL Server 2014 SP2. Esta atualização contém correções para os problemas que foram descobertos depois do lançamento do SQL Server 2014 SP2.

O SP2 foi lançado pela Microsoft em julho de 2016.

Atualização Cumulativa 9 para SQL Server 2014 SP2

De acordo com o artigo KB4055557 publicado no site de suporte da Microsoft, a Atualização Cumulativa 9 altera o build para 12.0.5563.0 e traz correções para múltiplos bugs.

Entre os bugs corrigidos estão que faz com que o DBCC CHECKDB retorne erros de consistência se a função SOUNDEX é usada em certos cenários e um que gera o erro “Invalid comparison due to NO COLLATION”.

A lista completa com todos os bugs corrigidos por esta atualização cumulativa pode ser vista no link acima.

A Atualização Cumulativa 9 para SQL Server 2014 SP2 está disponível para download aqui em múltiplos idiomas para plataformas 32 e 64 bits.

Atualização Cumulativa 9 para SQL Server 2014 SP2
De acordo com o artigo KB4055557 publicado no site de suporte da Microsoft, a Atualização Cumulativa 9 altera o build para 12.0.5563.0 e traz correções para múltiplos bugs

Correcções incluídas neste pacote de atualizações cumulativas


Fontes e Direitos Autorais: Microsoft.com – 19/12/2017 –https://support.microsoft.com/pt-br/help/4055557/cumulative-update-9-for-sql-server-2014-sp2

#18 – Para que serve


Olá você, boa noite.

Tudo bem?

Este é mais um post da sessão Para que serve, nesta última sexta-feira de aulas aqui na Fatec São Roque, hoje meu queridos pimpolhos não estão presentes, final de semestre é sempre assim eles somem, mas eu estou aqui vivinho da silva e pronto para compartilhar um pouco do conhecimento adquirido nos alguns dias.

Hoje não vou destacar novidades adicionadas ao Microsoft SQL Server em suas últimas versões, ao contrário quero trazer para você um exemplo de código que poderá lhe ajudar muito ainda mais com um novo ano que esta se aproximando rapidamente. Sempre nesta época do ano diversos estabelecimentos comerciais, lojas e demais locais de compra e venda gostam de ofertar aos seus clientes aquele tradicional folhinha ou calendário mensal do próxima ano.

É justamente isso que este novo post da sessão Para que serve tem o objetivo de trazer, apresentar como podemos através de um script desenvolvido no Microsoft SQL Server criar um calendário mensal ou anual igualzinho aqueles que ganhamos nos finais de ano.

O melhor ainda neste calendário é que nossa tabela será estrutura respeitando rigorosamente os dias da semana e seus respectivos nomes. Sendo assim, chegou a hora de conhecer um pouco mais sobre estas novas funções, desta forma, seja bem vindo ao #18 – Para que serve – Criando um calendário mensal com dias da semana.


Introdução

Um dos elementos mais comuns de se encontrar nas casas, apartamentos, escolas e demais locais de convivência é um calendário ou folhinha de meses e dias pregada nas paredes, afixada em geladeiras, portas retratos entre outros locais de fácil acesso e visualização para todos.

O elemento chamado de calendário criado a milhares de anos tem como principal função ajudar nós pessoas a nos identificar no tempo, ou seja, trata-se de um recurso tão básico mas de extrema importância no que diz respeito ao dia-a-dia das pessoas e suas atividades.

Este tipo de recurso não poderia estar ausente no Microsoft SQL Server, não que ele esteja totalmente presente, mas através das funcionalidades existentes na linguagem Transact-SQL ou simplesmente T-SQL temos total capacidade de criarmos o nosso calendário mensal ou até mesmo anual contendo os dias da semana, o número da semana e posteriormente demais dados necessários que possam compor o seu calendário.

Para que você possa acompanhar o processo de criação deste calendário personalizado, vamos utilizar como base para nosso cenário uma simples tabela denominada CalendarioMensal, nome mais do que sugestivo, começamos então pela criação desta tabela conforme apresenta o Bloco de Código 1 a seguir:

— Bloco de Código 1 – Criando a Tabela CalendarioMensal —

Create Table CalendarioMensal
(Contador TinyInt Identity(1,1) ,
Semana SmallInt,
Segunda TinyInt Null,
Terca TinyInt Null,
Quarta TinyInt Null,
Quinta TinyInt Null,
Sexta TinyInt Null,
Sabado TinyInt Null,
Domingo TinyInt Null)
Go

Show nossa tabela CalendarioMensal esta criada e pronta para ser utilizada, nosso próxima passo é começar a estruturar o ambiente para darmos inicio a inserção dos dados que vão compor o calendário, neste caso, vamos estabelecer o dia inicial da semana e evitar a contagem de linhas a cada manipulação de dados, para tal vamos o Bloco de Código 2 conforme apresentado abaixo:

— Bloco de Código 2 – Definindo o dia inicial da semana e evitando a contagem de linhas —

— Definindo o dia inicial da semana —
Set DateFirst 7
Go

— Desativando a contagem de linhas após manipulação de dados —
Set NoCount On
Go

Observações:

  1. Ao utilizar a diretiva Set DateFirst temos a possibilidade de definir de acordo qual deverá ser o primeiro dia da semana dentro da sessão ou transação que estamos trabalhando independente do idioma, linguagem ou configurações regionais do seu sistema operacional. Neste caso, estou definindo através do número 7 que qualquer semana terá inicio no sétimo dia, ou seja, no sábado.
  2. Ao utilizar a diretiva Set NoCount informando o valor de On estamos orientando o Database Engine enviar uma instrução para o Query Processor que ao final do processamento da transação ou bloco de transação não deverão ser informadas em tela a quantidade de linhas processadas ou manipuladas pelo Database Engine.

Nosso próximo passo consiste na declaração das variáveis que iremos utilizar para definir o período de dias ou período mensal que queremos criar, desta forma, vamos utilizar as variáveis: @InicioDeMes, @FinalDeMes e @Contador, conforme o Bloco de Código 3 apresentado abaixo:

— Bloco de Código 3 – Definição e atribuição das variáveis —

— Declarando e definindo as variáveis —
Declare @InicioDeMes Datetime,
@FinalDeMes Datetime,
@Contador TinyInt

— Atribuindo os valores para as variáveis —
Set @InicioDeMes = ‘2018-01-01’
Set @FinalDeMes = ‘2018-01-31’
Set @Contador = 1

Note que estou definindo o período de dias que correspondem ao mês de janeiro de 2018, sendo assim, nosso calendário mensal será criado respeitando a quantidade de dias e períodos de semana específicos do próximo mês de janeiro.

Ufa, estamos caminhando bem, vamos em frente, agora já se aproximando do processo de inserção do respectivo período de dias informado anteriormente e na sequência a atualização de cada dia de acordo com o exclusivo e respectivo dia da semana, vamos então conhecer o Bloco de Código 4 apresentado abaixo, não se esqueça de executar este bloco pois ele é o mais importante:

— Bloco de Código 4 – Loop para inserção e atualização dos dias referentes ao mês informando —

While @InicioDeMes <= @FinalDeMes
Begin

— Inserindo os valores na Tabela Calendário —
Insert Into CalendarioMensal Default Values

While 1<=@Contador
Begin

Update CalendarioMensal
               Semana = IsNull(DatePart(Week, Segunda),Year(GetDate()-1)),
               Set Segunda = Case When DatePart(WeekDay,@InicioDeMes) = 2 Then DatePart(Day,@InicioDeMes) Else Segunda End,
              Terca = Case When DatePart(WeekDay,@InicioDeMes) = 3 Then DatePart(Day,@InicioDeMes) Else Terca End,
             Quarta = Case When DatePart(WeekDay,@InicioDeMes) = 4 Then DatePart(Day,@InicioDeMes) Else Quarta End,
             Quinta = Case When DatePart(WeekDay,@InicioDeMes) = 5 Then DatePart(Day,@InicioDeMes) Else Quinta End,
              Sexta = Case When DatePart(WeekDay,@InicioDeMes) = 6 Then DatePart(Day,@InicioDeMes) Else Sexta End,
              Sabado = Case When DatePart(WeekDay,@InicioDeMes) = 7 Then DatePart(Day,@InicioDeMes) Else Sabado End,
              Domingo = Case When DatePart(WeekDay,@InicioDeMes) = 1 Then DatePart(Day,@InicioDeMes) Else Domingo End              
Where Contador = @Contador
And DatePart(Month,@InicioDeMes) = DatePart(Month,@FinalDeMes)

  If DatePart(WeekDay,@InicioDeMes) = 1
   Break
    Set @InicioDeMes = Dateadd(Day,1,@InicioDeMes)
   End

  Set @InicioDeMes = Dateadd(Day,1,@InicioDeMes)
  Set @Contador = @Contador + 1
End
Go

Observações:

  1. Talvez você possa estar na dúvida do motivo ao qual estou utilizando o comando Insert dentro do loop de inserção de dados em nosso calendário, na verdade se você analisar a cada volta realizada pelo loop será inserido um conjunto de valores novas em nossa tabela CalendarioMensal, com base, neste novo conjunto de valores teremos a capacidade de distribuir os valores de acordo com a sua respectiva coluna, ou melhor dia da semana.
  2. Estou utilizando o comando Update no Bloco de Código 4, como elemento subsequente dos valores inseridos através do comando Insert, fazendo uma rápida análise após o conjunto de valores correspondentes ao dia do mês, é estabelecido tratamento para cada valor de acordo com o dia da semana de forma única para, possibilitando assim identificar o valor inserido que posteriormente estará atrelado ao determinado dia da semana, desta forma é feita a atualização do dia na coluna ao qual ele corresponderia na calendário impresso.

Já estamos no final, o mais complicado e talvez difícil de ser feito foi realizado e espero que tudo tenha ocorrido corretamente que se relaciona a inserção dos dados na tabela CalendarioMensal, se você chegou até é porque conseguiu, então vamos avançar mais um passo e agora ver como nossos dados forma inseridos e serão apresentado em tela, para tal procedimento utilize o Bloco de Código 5 declarado na sequência:

— Bloco de Código 5 – Visualizando o Calendário Mensal e seus respectivos dias e semanas —

Select Semana As ‘Numero da Semana’,
            Segunda As ‘Segunda-Feira’,
            Terca As ‘Terça-Feira’,
            Quarta As ‘Quarta-Feira’,
            Quinta As ‘Quinta-Feira’,
            Sexta As ‘Sexta-Feira’,
            Sabado As ‘Sábado’,
            Domingo As ‘Domingo’
From CalendarioMensal
Go

Afim de ilustrar e comprovar o resultado apresentado pelo Bloco de Código 5, apresento a seguir a Figura 1 abaixo:


Figura 1 – Calendário Mensal correspondente ao mês de janeiro de 2018.

Show, show, sensacional é isso ai, conseguimos, chegamos ao final de mais um post da sessão Para que serve.


Referências

https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/functions/year-transact-sql

Links

Caso você ainda não tenha acessado os posts anteriores desta sessão, fique tranquilo é fácil e rápido, basta selecionar um dos links apresentados a seguir:

https://pedrogalvaojunior.wordpress.com/2017/11/24/17-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/10/01/16-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/06/28/15-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/04/30/14-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/03/25/13-para-que-serve/

https://pedrogalvaojunior.wordpress.com/2017/01/23/12-para-que-serve/

Conclusão

Como sempre a Microsoft e toda sua equipe nos surpreende com sua capacidade de trabalho, fortalecendo cada vez mais o Microsoft SQL Server não somente com um SGBD ou ferramenta de banco de dados, mas sim um ambiente completo para qualquer tipo de análise, desenvolvimento e administração que esteja relacionada com dados.

Através da diversidade de recursos e funcionalidades existentes no Microsoft SQL Server temos a capacidade de criar e manipular diversos tipos de objetos existentes no mundo real e que fazem parte do dia-a-dia das pessoas, e neste post você pode mais uma vez comprovar que isso é possível ser implementado, como visto aqui a criação e inserção de valores que representam a estrutura básica de um calendário impresso.

Este é o fantástico Microsoft SQL Server, surpreendente até nas funcionalidades e recursos mais básicos, produto mais do que bão e igual não existe so…..

Agradecimentos

Mais uma vez obrigado por sua ilustre visita, sinto-me honrado com sua presença, espero que este conteúdo possa lhe ajudar e ser útil em suas atividades profissionais e acadêmicas.

Quero também aproveitar para me despedir de vocês neste ano de 2017 e dizer que nos encontramos em breve, mas breve mesmo pois 2018 já esta batendo a porta.

Um forte abraço, até o próximo post da sessão Para que serve…..

Valeu.