Material de Apoio – Abril 2018


Muito, mas, muito bom dia!

São exatamente 08:00 horas da manhã e você já esta dando uma passadinha por aqui, que legal, obrigado por mais esta visita.

E ai tudo bem com você? Espero que sim. Estou aqui mais uma vez procurando colaborar e compartilhar com a comunidade técnica em mais um post da sessão Material de Apoio dedicado exclusivamente ao meu blog.

Espero que você esteja gostando do conteúdo aqui disponibilizado, como também, possa me ajudar a cada vez mais melhorar ainda.

O post de hoje

Seja bem-vindo a mais um post da sessão Material de Apoio, sendo o segundo do ano de 2018 e de número 156 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:

  • @@TranCount;
  • Claúsula Where;
  • Comando Declare;
  • Comando Kill;
  • Comando Order By;
  • Comando Rollback;
  • Comando While;
  • Conversão implícita de dados;
  • Cursor;
  • Database Level Events;
  • Dynamic Management Function sys.dm_exec_query_plan;
  • Dynamic Management Function sys.dm_exec_sql_text;
  • Dynamic Management View sys.dm_exec_query_stats;
  • Dynamic Management View sys.dm_os_tasks;
  • Dynamic Management View sys.dm_os_threads;
  • Error Code 3609;
  • Função Cast;
  • Função EventData();
  • Função Raiserror();
  • Função Top();
  • Loop de processamento infinito;
  • Opção Recompile;
  • Operador Cross Apply;
  • OS Threads;
  • Processos em execução;
  • Sessions;
  • Set RowCount;
  • Stored Procedure Exec;
  • System Table sys.sysprocesses;
  • Tratamento de Erros;
  • Trigger DDL; e
  • Variáveis.

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 – Abril 2018 – Encerramento processos que apresentam várias horas ou longo tempo de execução.sql

2 – Material de Apoio – Abril 2018 – Trigger DDL DATABASE LEVEL EVENTS – Bloqueando a criação de tabelas com um determinado nome.sql

3 – Material de Apoio – Abril 2018 – Identificando a SessionID e suas respectivas OS Threads.sql

4 – Material de Apoio – Abril 2018 – Relação de Querys – Apresentam conversão implícita de dados.sql

5 – Material de Apoio – Abril 2018 – Criando um loop infinito utilizando SET ROWCOUNT com Variable Table.sql

6 – Material de Apoio – Abril 2018 – Utilizando Rollback Transaction dentro de Trigger com tratamento de erro 3609.sql

7 – Material de Apoio – Abril 2018 – Utilizando Rollback Transaction dentro de Trigger decrementando o valor de @@Trancount.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/2018/02/13/material-de-apoio-fevereiro-2018/

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, sinto-me honrado e orgulhoso de contar com a sua presença.

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 junho, até lá continue curtindo sua vida e compartilhando suas experiência.

Um forte abraço, muita saúde, sucesso e vamos em frente…

Anúncios

SQL Operations Studio Preview v0.25.4 – Janeiro 2018


A Microsoft disponibilizou para download nesta semana o SQL Operations Studio Preview v0.25.4. A ferramenta está disponível para Windows, macOS e Linux.

Se você ainda não conhece esta nova ferramenta, saiba que o SQL Operations Studio é uma ferramenta gratuita para gerenciamento do SQL Server, Azure SQL Database e Azure SQL Data Warehouse.

A primeira versão Preview pública foi lançada no início de novembro de 2017. De acordo com o changelog, a versão 0.25.4 traz correções de bugs, corrige um problema com o tamanho do ícone no menu Iniciar, muda o campo Nome do servidor para Servidor na caixa de diálogo Conexão e mais.

Confira a lista completa de melhorias e correções disponíveis no changelog clicando aqui.

Microsoft SQL Operations Studio Preview v0.25.4

A versão para Windows do SQL Operations Studio Preview v0.25.4 está disponível para download aqui com instalador e aqui em versão portátil (não requer instalação). As versões para outras plataformas e as instruções de instalação podem ser encontradas aqui.

Para maiores informações acesse: https://docs.microsoft.com/en-us/sql/sql-operations-studio/what-is

Fontes e Direitos Autorais: Microsoft – 17/01/2018 – https://docs.microsoft.com/en-us/sql/sql-operations-studio/release-notes

Microsoft abre inscrições para o maratona bots


A Microsoft abriu as inscrições para o Maratona Bots, um curso de capacitação online e gratuito destinado a programadores que querem aprender como criar chatbots, robôs que conversam via chat utilizando recursos de Inteligência Artificial.

O curso terá quatro semanas de duração e os conteúdos didáticos serão liberados semanalmente. O primeiro módulo estará disponível a partir de segunda-feira, dia 15 de janeiro.

Após o término das aulas, os participantes terão até o dia 26 de março para desenvolverem um bot atendendo aos critérios da organização do curso. Os projetos serão avaliados por um time de especialistas da Microsoft. O objetivo é fomentar a criatividade e o aprimoramento técnico dos participantes em serviços de Inteligência Artificial disponíveis na nuvem.

A maratona também fará uma breve introdução aos conceitos de machine learning e Inteligência Artificial, que podem auxiliar na construção de aplicativos de diferentes tipos. São conhecimentos que ajudam a formar um profissional capaz de fazer frente às demandas atuais das empresas interessadas em promover a transformação digital.

Microsoft abre inscrições para o Maratona Bots

O público-alvo principal do curso são os desenvolvedores de software. Profissionais de áreas relacionadas que tenham conhecimento básico de programação e desejam entender melhor a aplicabilidade da tecnologia nos negócios também podem participar.

Além das aulas de vídeo online, o curso terá materiais de apoio em formato PDF e laboratórios práticos. Durante o período de aulas, os participantes poderão tirar suas dúvidas com instrutores que estarão on-line. Depois do encerramento, o conteúdo das aulas continuará disponível na plataforma on-line.

Desenvolvedores e demais interessados podem se inscrever aqui.

Fontes e Direitos autorais: Microsoft News Center Brasil – 10/01/2018.

Short Scripts – Março 2017


Hoje é sexta – feira, sexta – feira…

Salve, salve comunidade e amantes de bancos de dados e SQL Server, Tudo bem? Mais uma final de semana próximo após uma longa semana de muito trabalho, se eu for falar de muito trabalho, sinceramente  esta semana foi complicada, repleta de novidades e muita troca de conhecimento.

Conforme o prometido no final de 2016, estou retornando com o primeiro post da sessão Short Scripts, sessão criada a alguns anos no meu blog que lentamente esta conseguindo ajudar diversos profissionais da área de banco de dados na busca por exemplos de códigos que possam solucionar ou elucidar na resolução de um determinado problema.

O post de hoje

Como já destaquei acima, este é o primeiro post de 2017 dedicado exclusivamente a sessão Short Scripts, na relação de scritps selecionados para hoje, você vai poder encontrar códigos relacionados com os seguintes assuntos:

  • Auditoria,
  • Comando Intersect,
  • Comando OpenQuery,
  • Comando Order By,
  • Datatype Char,
  • Datatype Int,
  • DMF Sys.dm_exec_sessions,
  • DMV Sys.system_internals_partitions,
  • DMV Sys.system_internals_allocation_units,
  • Função Substring,
  • Índices,
  • Informações sobre conexão de usuário,
  • Páginas de Dados,
  • Trigger, e
  • Variáveis.

Então mãos no teclado, a seguir apresento os códigos e exemplos selecionados para o Short Script – Março 2017. Vale ressaltar que todos os scripts publicados nesta sessão são devidamente testados antes de serem publicados, 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 a vontade para compartilhar, comentar, melhorar cada um destes códigos.

Short Scripts

— Short Script 1 – Realizando Auditoria in Live —

SELECT [Spid] = session_Id
, ecid
, [Database] = DB_NAME(sp.dbid)
, [User] = nt_username
, [Status] = er.status
, [Wait] = wait_type
, [Individual Query] = SUBSTRING (qt.text,
er.statement_start_offset/2,
(CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE er.statement_end_offset END –
er.statement_start_offset)/2)
,[Parent Query] = qt.text
, Program = program_name
, Hostname
, nt_domain
, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50              — Ignore system spids.
AND session_Id NOT IN (@@SPID)     — Ignore this current statement.
ORDER BY 1, 2
Go

— Short Script 2 – Utilizando comando Intersect com Datatypes Char e Int —

Create Table #A (x Char(2));
Go
Insert Into #A Values (‘1’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘2’);
Insert Into #A Values (‘3’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘5’);
Insert Into #A Values (‘6’);
Insert Into #A Values (‘9’);
Go
Create Table #B (M BigInt);
Go
Insert Into #B Values(5);
Insert Into #B Values(5);
Insert Into #B Values(6);
Insert Into #B Values(7);
Insert Into #B Values(7);
Go
— (Select #1)
SELECT x AS ‘Select #1’ FROM #A
INTERSECT SELECT M FROM #B
Go
— (Select #2)
SELECT DISTINCT(x) AS ‘Select #2’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #3)
SELECT DISTINCT(x) AS ‘Select #3’
FROM #A LEFT OUTER JOIN #B
ON #A.x = #B.M
Go
— (Select #4)
SELECT DISTINCT(x) AS ‘Select #4’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— (Select #5)
SELECT x AS ‘Select #5’
FROM #A INNER JOIN #B
ON #A.x = #B.M
Go
— Short Script 3 – Utilizando comando OpenQuery com variáveis —
— Valores Básicos —
DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = ‘teste’
SELECT  @TSQL = ‘SELECT * FROM OPENQUERY(MeuLinkedServer,”SELECT * FROM MinhaTabela WHERE User = ””’ + @VAR + ”””’)’
EXEC (@TSQL)
Go
— Query Complexa —
DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = ‘MyLinkedServer’
SET @OPENQUERY = ‘SELECT * FROM OPENQUERY(‘+ @LinkedServer + ‘,”’
SET @TSQL = ‘SELECT au_lname, au_id FROM pubs..authors”)’
EXEC (@OPENQUERY+@TSQL)
— Use o Sp_executesql procedimento armazenado —
DECLARE @VAR char(2)
SELECT  @VAR = ‘CA’
EXEC MyLinkedServer.master.dbo.sp_executesql
N’SELECT * FROM pubs.dbo.authors WHERE state = @state’,
N’@state char(2)’,
@VAR
Go
— Short Script 4 – Realizando order by com base na função SubString —
Declare @Tabela Table
(Codigo VarChar(15))
Insert Into @Tabela Values(‘191-XXX-003’)
Insert Into @Tabela Values(‘192-XXX-003’)
Insert Into @Tabela Values(‘193-XXX-003’)
Insert Into @Tabela Values(‘194-XXX-003’)
Insert Into @Tabela Values(‘195-XXX-003’)
Insert Into @Tabela Values(‘191-XXX-001’)
Insert Into @Tabela Values(‘192-XXX-001’)
Insert Into @Tabela Values(‘193-XXX-001’)
Insert Into @Tabela Values(‘194-XXX-001’)
Insert Into @Tabela Values(‘195-XXX-001’)
Insert Into @Tabela Values(‘191-XXX-002’)
Insert Into @Tabela Values(‘192-XXX-002’)
Insert Into @Tabela Values(‘193-XXX-002’)
Insert Into @Tabela Values(‘194-XXX-002’)
Insert Into @Tabela Values(‘195-XXX-002’)
Select * from @Tabela
Order By SubString(codigo,Len(Codigo)-2,3) Asc
Go
— Short Script 5 – Monitorando querys em execução —
SELECT
DES.SESSION_ID,
DES.CPU_TIME,
DES.READS,
DES.WRITES,
DES.LOGICAL_READS,
DES.ROW_COUNT,
DER.SESSION_ID,
DES.STATUS,
DES.HOST_NAME,
DES.PROGRAM_NAME,
DES.LOGIN_NAME,
DES.ORIGINAL_LOGIN_NAME,
DEC.CLIENT_NET_ADDRESS,
DEC.AUTH_SCHEME,
DEC.NET_TRANSPORT,
SUBSTRING(T.[TEXT], DER.[STATEMENT_START_OFFSET] / 2,
COALESCE(NULLIF(DER.[STATEMENT_END_OFFSET], – 1) / 2, 2147483647)) AS COMANDO
FROM
SYS.DM_EXEC_SESSIONS AS DES
INNER JOIN SYS.DM_EXEC_REQUESTS DER
ON DER.BLOCKING_SESSION_ID = DES.SESSION_ID
INNER JOIN SYS.DM_EXEC_CONNECTIONS DEC
ON DEC.SESSION_ID = DES.SESSION_ID
INNER JOIN SYS.DM_EXEC_REQUESTS DER2
ON DER2.SESSION_ID = DES.SESSION_ID
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(DER.[SQL_HANDLE]) AS T
GO
— Short Script 6 – Identificando tabelas e suas respectivas páginas de dados —
— Exemplo 1: —
SELECT P.partition_id,
OBJECT_NAME(P.object_id) As ObjectName,
U.allocation_unit_id,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.Partitions As P INNER JOIN Sys.Allocation_Units As U
ON P.hobt_id = U.container_id
Inner Join Sys.system_internals_allocation_units SU
On u.allocation_unit_id = su.allocation_unit_id
Go
— Exemplo 2: —
SELECT SIP.partition_id,
OBJECT_NAME(SIP.object_id) As ObjectName,
sip.rows,
SU.First_Page,
SU.Root_Page,
SU.First_IAM_Page
From Sys.system_internals_partitions As SIP Inner Join Sys.system_internals_allocation_units SU
On sip.partition_id = su.allocation_unit_id
Go
— Short Script 7 – Identificando índices com Escrita Excessiva —
— Quantidade de Índices com Escrita Excessiva em comparação a leitura —
SELECT  OBJECT_NAME(s.object_id),
i.name,
i.type_desc
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK ) Inner JOIN sys.indexes i WITH (NOLOCK)
ON s.index_id = i.index_id
AND s.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Quantidade de Índices com Escrita Excessiva —
SELECT  COUNT(*)
FROM    sys.dm_db_index_usage_stats s WITH ( NOLOCK )
WHERE   OBJECTPROPERTY(s.[object_id], ‘IsUserTable’) = 1
AND s.database_id = DB_ID()
AND s.user_updates > ( s.user_seeks + s.user_scans + s.user_lookups )
AND s.index_id > 1
Go
— Short Script 8 – Identificando o espaço ocupado por conexões em uso —
SELECT A.session_id,
B.host_name, B.Login_Name ,
(user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 as TotalalocadoMB,
D.Text
FROM sys.dm_db_session_space_usage A Inner JOIN sys.dm_exec_sessions B
ON A.session_id = B.session_id
Inner JOIN sys.dm_exec_connections C
ON C.session_id = B.session_id
CROSS APPLY sys.dm_exec_sql_text(C.most_recent_sql_handle) As D
WHERE A.session_id > 50
and (user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128 > 100 — Ocupam mais de 100 MB
ORDER BY totalalocadoMB desc
COMPUTE sum((user_objects_alloc_page_count + internal_objects_alloc_page_count)*1.0/128)
Go
— Short Script 9 – Obtendo a diferença de datas entre registro anterior e o próximo registro —
Create Table Datas
(ID Int Identity(1,1),
DataInicio Date,
DataFinal Date)
Go
Insert Into Datas Values (GETDATE(), GETDATE()+30)
Insert Into Datas Values (GETDATE()+1, GETDATE()+20)
Insert Into Datas Values (GETDATE()+2, GETDATE()+10)
Insert Into Datas Values (GETDATE(), GETDATE()+5)
Go
— Exemplo 1 —
Select I.ID, I.DataInicio, F.DataFinal,
DateDiff(D, I.DataInicio, F.DataFinal) As Intervalo
From Datas I Left Join Datas F
On I.ID = F.ID + 1

Go

— Exemplo 2 —
SELECT
[current].Id,
[current].Time CurrentValue,
[next].Time          NextValue
FROM #temp AS [current] LEFT JOIN #temp AS [next]
ON [next].Id = (SELECT MIN(Id) FROM #temp

                                 WHERE Id > [current].Id)
Go
— Short Script 10 – Criando um trigger condicional —
–Criando a Table de Novos Produtos–
Create Table NovosProdutos
(Codigo Int Identity(1,1),
Descricao VarChar(10))
–Criando a Table de Histórico Novos Produtos–
Create Table HistoricoNovosProdutos
(Codigo Int,
Descricao VarChar(10))
Go
–Inserindo valores —
Insert Into Novosprodutos Values(‘Arroz’)
Insert Into Novosprodutos Values(‘Arroz1’)
Insert Into Novosprodutos Values(‘Arroz2’)
Insert Into Novosprodutos Values(‘Arroz3’)
Go
–Criando a Trigger para controle de histórico–
Create TRIGGER T_Historico
ON NovosProdutos
for update
AS
IF (Select Descricao from Inserted) <> (Select Descricao from Deleted)
BEGIN
INSERT Into HistoricoNovosProdutos (Codigo, Descricao)
SELECT Codigo, Descricao FROM INSERTED
END
Go
–Fazendo os teste —
Update NovosProdutos
Set Descricao=’Arroz 4′
Where Codigo = 1
Go
Update NovosProdutos
Set Descricao=’Arroz1′
Where Codigo = 2
Go
Select * from NovosProdutos
Go

Muito bem, 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 e 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 bastante 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:

Agradecimento

Mais uma vez obrigado por sua visita, um forte abraço…

Nos encontramos em breve nos próximos posts desta e outras sessões do meu blog, valeu.

Trabalhando com Paginação de dados no Microsoft SQL Server 2012 e conjunto com a Linguagem PHP


Paginação com SQL Server 2012 e PHPOlá pessoal, meu nome é William sou analista de desenvolvimento WEB esse é meu primeiro post como convidado do Junior Galvão – MVP, pretendo colaborar em outras oportunidades sempre com foco em desenvolvimento com SQL Server e para começar vou demonstrar como podemos construir uma paginação com SQL Server 2012 e PHP.

No meu blog devwilliam.com.br já publiquei uma série de artigos sobre paginação com diversos SGBDs (SQL Server 2008, PostgreSQL e MySQL) em conjunto com a linguagem PHP:

Paginação com SQL Server 2008 R2 e PHP
Paginação com PostgreSQL e PHP
Paginação com MySQL e PHP

Introdução sobre OFFSET e FETCH

Mas esse post com SQL Server 2012 difere da maneira como foi montada a paginação com SQL Server 2008 R2, pois até essa versão era necessário usar CTE (Commo Table Expression) para obtermos a paginação dos dados, já na versão 2012 foram adicionadas as cláusulas OFFSET e FETCH que devem ser usadas sempre em conjunto com a cláusula ORDER BY para paginação.

Essa feature facilitou muito a vida do desenvolvedor quando era necessário paginar um grande volume de registros, principalmente em aplicações WEB, além de possuir um plano de execução menos custoso que as paginações envolvendo CTE.

OFFSET -> Identifica a quantidade de linhas que deverão ser ignoradas antes das linhas que serão retornadas pela consulta, valor inteiro maior ou igual a zero.

FETCH -> Identifica a quantidade de linhas que deverão ser retornadas pela consulta após o processamento da cláusula OFFSET, valor inteiro maior ou igual a zero.

Observação: A cláusula TOP não pode ser combinada na mesma instrução de consulta que utiliza OFFSET e FETCH.

Exemplo, selecionando registros da tabela cliente ordenados pelo campo id, mas serão ignorados as 5 primeiras linhas e serão retornados apenas 2 linhas:

SELECT id, nome, email FROM cliente ORDER BY id ASC OFFSET 5 ROWS FETCH NEXT 2 ROWS ONLY

 

Construindo Paginação com SQL Server 2012 e PHP

Abaixo segue o script para criar o banco de dados “blog” e  a tabela artigos “artigos“:
CREATE DATABASE blog
GO

USE blog

GO  
 
CREATE TABLE `artigos` (  
  id INT IDENTITY PRIMARY KEY,  
  titulo varchar(100),   
  autor varchar(100),  
  previa varchar(200),  
  data date  
)

 

Vamos inserir os 35 registros, não vou usar procedure ou function, no SQL Server podemos usar uma “gambiarra” que funciona bem para esses testes com carga de dados, após a instrução INSERT adicionamos “GO” seguido da quantidade de registros que queremos inserir.

 

INSERT INTO artigos(titulo, autor, previa, data)VALUES('Paginação com SQL Server 2012', 'João', 'Paginação sobre SQL Server 2012 publicada ...', getDate())

GO 35

 

Com isso já temos toda a parte de banco de dados finalizada, agora vamos para o principal, o script da index.php mas agora com toda a lógica PHP de consulta e paginação, para que esse código funcione é importante mencionar que a extensão pdo_sqlsrv.dll (Windows) ou pdo_dblib.so (Linux) tem que estar habilitada no PHP, script segue abaixo:

index.php

<?php 
 /* Constantes de configuração */ 
 define('QTDE_REGISTROS', 5); 
 define('RANGE_PAGINAS', 1); 
 
 /* Recebe o número da página via parâmetro na URL */ 
 $pagina_atual = (isset($_GET['page']) && is_numeric($_GET['page'])) ? $_GET['page'] : 1; 
 
 /* Cria uma conexão PDO com SQL Server */ 
 $pdo = new PDO("sqlsrv:host=localhost; database=blog;", "usuario", "123456"); 

/* Calcula a linha inicial da consulta */  
 $linha_inicial = ($pagina_atual -1) * QTDE_REGISTROS; 
 
 /* Instrução de consulta para paginação com SQL Server 2012 */ 
 $sql = "SELECT id, titulo, autor, previa, CONVERT(VARCHAR(10), data, 103) AS data FROM artigos ORDER BY id ASC OFFSET {$linha_inicial} ROWS FETCH NEXT ".QTDE_REGISTROS." ROWS ONLY";
 $stm = $pdo->prepare($sql); 
 $stm->execute(); 
 $dados = $stm->fetchAll(PDO::FETCH_OBJ); 
 
 /* Conta quantos registos existem na tabela */ 
 $sqlContador = "SELECT COUNT(*) AS total_registros FROM artigos"; 
 $stm = $pdo->prepare($sqlContador); 
 $stm->execute(); 
 $valor = $stm->fetch(PDO::FETCH_OBJ); 
 
 /* Idêntifica a primeira página */ 
 $primeira_pagina = 1; 
 
 /* Cálcula qual será a última página */ 
 $ultima_pagina = ceil($valor->total_registros / QTDE_REGISTROS); 
 
 /* Cálcula qual será a página anterior em relação a página atual em exibição */ 
 $pagina_anterior = ($pagina_atual > 1) ? $pagina_atual -1 : 0 ; 
 
 /* Cálcula qual será a pŕoxima página em relação a página atual em exibição */ 
 $proxima_pagina = ($pagina_atual < $ultima_pagina) ? $pagina_atual +1 : 0 ; 
 
 /* Cálcula qual será a página inicial do nosso range */ 
 $range_inicial = (($pagina_atual - RANGE_PAGINAS) >= 1) ? $pagina_atual - RANGE_PAGINAS : 1 ; 
 
 /* Cálcula qual será a página final do nosso range */ 
 $range_final = (($pagina_atual + RANGE_PAGINAS) <= $ultima_pagina ) ? $pagina_atual + RANGE_PAGINAS : $ultima_pagina ; 
 
 /* Verifica se vai exibir o botão "Primeiro" e "Pŕoximo" */ 
 $exibir_botao_inicio = ($range_inicial < $pagina_atual) ? 'mostrar' : 'esconder'; 
 
 /* Verifica se vai exibir o botão "Anterior" e "Último" */ 
 $exibir_botao_final = ($range_final > $pagina_atual) ? 'mostrar' : 'esconder'; 
 
 ?> 
<!DOCTYPE html>   
<html>   
<head>   
<meta charset='utf-8'>   
<title>Paginação com SQL Server 2012 e PHP</title>   
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">   
<link rel="stylesheet" href="css/estilo.css">   
</head>   
<body>   
<div class='container'>   
   <div class="row">   
     <h1 class="text-center">Paginação de Dados</h1>   
 
     <table class="table table-striped table-bordered">   
      <thead>   
         <tr class='active'>   
           <th>Código</th>   
           <th>Título</th>   
           <th>Autor</th>   
           <th>Prévia</th>   
           <th>Data</th>   
         </tr>   
      </thead>   
      <tbody>   
         <?php foreach($dados as $artigo):?>  
          <tr>   
            <td><?=$artigo->id?></td>   
            <td><?=$artigo->titulo?></td>   
            <td><?=$artigo->autor?></td>   
            <td><?=$artigo->previa?></td>   
            <td><?=$artigo->data?></td>   
          </tr>   
         <?php endforeach; ?>  
      </tbody>   
     </table>   
 
     <div class='box-paginacao'>     
         <a class='box-navegacao <?=$exibir_inicio?>' href="index.php?page=<?=$primeira_pagina?>" title="Primeira Página">Primeira</a>   
         <a class='box-navegacao <?=$exibir_inicio?>' href="index.php?page=<?=$pagina_anterior?>" title="Página Anterior">Anterior</a>     

        <?php 
        for ($i=$range_inicial; $i <= $range_final; $i++):  
            $destaque = ($i == $pagina_atual) ? 'destaque' : '' ;
            ?>  
            <a class='box-numero <?=$destaque?>' href="index.php?page=<?=$i?>"><?=$i?></a>    
        <?php endfor; ?>    

         <a class='box-navegacao <?=$exibir_final?>' href="index.php?page=<?=$proxima_pagina?>" title="Próxima Página">Próxima</a>   
         <a class='box-navegacao <?=$exibir_final?>' href="index.php?page=<?=$ultima_pagina?>" title="Última Página">Último</a>   
     </div>   
   </div>   
</div>   
</body>   
</html>

Observação: A folha de estilo CSS foi postado no artigo Paginação de Dados no PHP com PDO – Introdução.

O script está bem comentado, mas vou explicar os pontos que considero chave para que funcione a paginação com SQL Server 2012 da maneira que planejamos.

1 – Define 2 constantes no início do script, sendo a primeira QTDE_REGISTROS, para identificar quantos registros quero exibir por página, nesse caso apenas 5. Segunda constante RANGE_PAGINAS, serve para identificar quantas opções de páginas para navegação vou exibir antes e depois da página em destaque, nesse exemplo quero apenas 1 página (2 – 3 – 4).
 /* Constantes de configuração */  
 define('QTDE_REGISTROS', 5);   
 define('RANGE_PAGINAS', 1);

 

2 – Nesse trecho fazemos uma validação do parâmetro (page) recebido via GET, verificando se o parâmetro page existe e se o valor é numérico, caso uma das validações não seja verdadeira atribuímos o valor “1” para variável $pagina_atual.
 /* Recebe o número da página via parâmetro na URL */   
$pagina_atual = (isset($_GET['page']) && is_numeric($_GET['page'])) ? $_GET['page'] : 1;

 

3 – Nessa linha estou calculando qual será a linha inicial da consulta, baseado no parâmetro passado via URL e no valor da constante QTDE_REGISTROS.
 $linha_inicial = ($pagina_atual -1) * QTDE_REGISTROS;

 

4 – Nessa linha temos a mágica, com o auxílio das cláusulas OFFSET e FETCH conseguimos montar nossa paginação com SQL Server 2012 através da consulta sendo parametrizada pelos valores recebidos e calculados.
 $sql = "SELECT id, titulo, autor, previa, CONVERT(VARCHAR(10), data, 103) AS data FROM artigos ORDER BY id ASC OFFSET {$pagina} ROWS FETCH NEXT ".QTDE_REGISTROS." ROWS ONLY";

 

5 – O segredo para saber quantas páginas serão necessárias é saber quantos registros serão retornados, podemos fazer isso executando um COUNT(*) na tabela. Com esse resultado basta dividi-lo pela quantidade de registros que iremos exibir por página, nesse caso pela constante QTDE_REGISTROS. Esse valor também serve para sabermos qual será a última página.
 /* Conta quantos registos existem na tabela */  
 $sqlContador = "SELECT COUNT(*) AS total_registros FROM artigos";   
 $stm = $pdo->prepare($sqlContador);   
 $stm->execute();   
 $valor = $stm->fetch(PDO::FETCH_OBJ);

 

6 – Nesse conjunto de linhas fica toda a mágica da paginação, coloquei os nomes das variáveis bem intuitivos. Observem que para deixar o código mais legível estou usando em alguns pontos operadores TERNÁRIOS, para não poluir o código com vários IFs simples. Observem que para calcular a quantidade de páginas basta dividir o total de registros pela constante QTDE_REGISTROS por página $ultima_pagina = ceil($valor->total_registros / QTDE_REGISTROS).
 /* Idêntifica a primeira página */  
 $primeira_pagina = 1;   
 
 /* Cálcula qual será a última página */  
 $ultima_pagina  = ceil($valor->total_registros / QTDE_REGISTROS);   
 
 /* Cálcula qual será a página anterior em relação a página atual em exibição */   
 $pagina_anterior = ($pagina_atual > 1) ? $pagina_atual -1 : 0 ;   
 
 /* Cálcula qual será a pŕoxima página em relação a página atual em exibição */   
 $proxima_pagina = ($pagina_atual < $ultima_pagina) ? $pagina_atual +1 : 0 ;  
 
 /* Cálcula qual será a página inicial do nosso range */    
 $range_inicial  = (($pagina_atual - RANGE_PAGINAS) >= 1) ? $pagina_atual - RANGE_PAGINAS : 1 ;   
 
 /* Cálcula qual será a página final do nosso range */    
 $range_final   = (($pagina_atual + RANGE_PAGINAS) <= $ultima_pagina ) ? $pagina_atual + RANGE_PAGINAS : $ultima_pagina ;

 

7 – O código abaixo utiliza classes que criei no CSS para esconder ou exibir os botões de Primeira, Anterior, Próxima e Última página, conforme a necessidade.
 /* Verifica se vai exibir o botão "Primeira" e "Anterior" */   
 $exibir_botao_inicio = ($range_inicial < $pagina_atual) ? 'mostrar' : 'esconder'; &nbsp;
Paginação Inicial

 

 
 /* Verifica se vai exibir o botão "Próxima" e "Última" */   
 $exibir_botao_final = ($range_final > $pagina_atual) ? 'mostrar' : 'esconder'; &nbsp;
Paginação Final

 

Abaixo temos o resultado final quando acessamos a primeira página, notem que não temos opções para o primeiro e nem registro anterior.
Paginação de dados no início

 

Agora acessando a página “3” temos opções baseadas no range, com 1 página anterior e 1 página posterior, além das opções de primeira, anterior, próxima e última página.
Paginação de dados no meio

 

E para finalizar, acessando a última página “7” temos a opção de exibir uma página anterior “6” e os botões anterior e primeira página.
Paginação de dados no fim

 

Bom pessoal, neste artigo demonstrei como construir uma paginação com SQL Server 2012 e PHP, é evidente que existem diversas maneiras de se montar esse layout de paginação, com variações de CSS, HTML e lógica PHP. Na internet existem diversos plugins para esse tipo de funcionalidade, os principais frameworks para PHP possuem métodos para isso, mas antes de usar soluções prontas é interessante saber como funciona, quais as limitações do SGBD que você está usando em seu projeto para se trabalhar com paginação.

Para quem quiser conhecer meu blog devwilliam.com.br, tenho vários posts sempre ligados a desenvolvimento com Delphi, PHP, jQuery e Linux!

Agradeço mais uma vez ao Junior Galvão – MVP pelo convite, espero que tenham gostado e até a próxima …

MICROSOFT LANÇA O VISUAL STUDIO 14 CTP3


A Microsoft disponibilizou hoje para download o terceiro Community Technology Preview (CTP3) do Visual Studio 14, versão de testes mais recente da nova geração do seu ambiente integrado de desenvolvimento. De acordo com a empresa, o build do Visual Studio 14 CTP3 é 14.0.22013.1.

Assim como fez com o Office 2013 (ou Office 14), a Microsoft optou por pular a versão 13 do Visual Studio.

A versão final do Visual Studio 14 tem lançamento previsto para 2015, mas nenhuma data específica foi divulgada. Antes do lançamento da versão final a Microsoft pretende disponibilizar uma nova versão preview mais completa e já com o nome oficial ainda em 2014.

A plataforma de compilação .NET “Roslyn”, o ASP.NET v.Next (codinome Project K) e o suporte para a plataforma Apache Cordova foram introduzidos no Visual Studio 14 CTP1 e continuam presentes no CTP3.

Microsoft lança o Visual Studio 14 CTP3
O Visual Studio 14 CTP3 traz correções de bugs introduzidos com a versão anterior e também traz diversos novos recursos e melhorias.

Uma das novidades no CTP3 é que o suporte para .NET Native foi integrado ao Visual Studio 14. Ele também traz PerfTips no Depurador, melhorias no Visual C++, suporte para ícones em alta resolução e mais.

O changelog completo do Visual Studio 14 CTP3 e dos dois CTPs anteriores pode ser encontrado noartigo KB2967191 publicado na Base de Conhecimento da Microsoft.

FAÇA O DOWNLOAD DO VISUAL STUDIO 14 CTP3

Usuários e desenvolvedores interessados em testar esta versão podem fazer o download do instalador Web* aqui ou da imagem ISO aqui. A edição do Visual Studio 14 CTP3 disponível para download é aProfessional.

Além do Visual Studio também estão disponíveis para download aqui o SDK, Remote Tools** e o Microsoft Visual C++ Multibyte Character Set (MBCS).

*Baixa e instala os componentes necessários.
**Para plataformas x86, x64 e ARM.

 

Fontes e Direitos Autorais: Baboo.com – SID VICIOUS.