SQLServerLogo

Considerando a forma como o SQL Server é utilizado no dia-a-dia em muitas organizações, é possível afirmar sem hesitação que grande do desenvolvimento em T-SQL gira em torno da construção de stored procedures. Muitas destas rotinas são implementadas com o intuito de produzir resultados em um formato tabular, empregando para isto uma consulta SQL simples ou até agrupamentos mais complexos de instruções (podendo envolver neste caso uma série de cálculos ou, mesmo, junções de dados provenientes de diferentes fontes).

Embora menos frequente, há a possibilidade de que em algum momento o retorno produzido por uma stored procedure precise ser incluído em uma tabela para uso posterior. Uma razão plausível para isto seria a necessidade de monitoramento das informações produzidas por algum tipo de processo. O objetivo deste artigo é demonstrar como isto pode ser feito no SQL Server, apresentando para tanto um exemplo baseado na utilização da procedure de sistema sp_who2 (esta última representando uma variação de outra rotina chamada sp_who).

Inserindo o retorno de uma procedure em uma tabela

O exemplo detalhado a seguir fará uso de uma tabela chamada “HistoricoProcessos”, a ser criada em um banco de dados no SQL Server 2014 (no caso, a base utilizada tem por nome “TesteRetornoProcs”). Essa estrutura armazenará dados sobre os processos que estão em execução num determinado momento, a partir de uma instância específica do SQL Server. A ideia é que as informações registradas sejam utilizadas por um DBA posteriormente, em atividades que envolvam o monitoramento de um servidor de banco de dados.

Na Listagem 1 está o script para a criação da tabela HistoricoProcessos. Foi adotada aqui, em linhas gerais, a mesma estrutura do retorno produzido pela stored procedure sp_who2: o resultado deste último objeto é um conjunto de registros baseados em dados da View de sistema sys.sysprocesses.

Farão parte da tabela HistoricoProcesso os seguintes campos:

  • IdHistorico: campo auto-incremento que corresponde à chave primária da tabela HistoricoProcessos;
  • DtHistorico: data/hora em que foi efetuada a execução da procedure sp_who2;
  • SPID: ID de sessão no SQL Server;
  • Status: status de um processo no SQL Server;
  • Login: login associado a um processo no SQL Server;
  • HostName: computador em que se originou um processo;
  • BlkBy: processo responsável por bloquear a tarefa que se está considerando;
  • DBName: banco de dados utilizado por um processo;
  • Command: comando que iniciou a execução de um processo;
  • CPUTime: tempo total de CPU gasto na execução de um processo;
  • DiskIO: total de operações de leitura/escrita na execução de um processo;
  • LastBatch: data/hora da última execução de um processo;
  • ProgramName: nome da aplicação associada a um processo;
  • RequestId: Id da requisição vinculada a um processo.
CREATE TABLE dbo.HistoricoProcessos
(
    IdHistorico INT IDENTITY(1,1) NOT NULL,
    DtHistorico DATETIME,
    SPID SMALLINT,
    Status NCHAR(30),
    Login NVARCHAR(128),
    HostName NVARCHAR(128),
    BlkBy NVARCHAR(128),
    DBName NVARCHAR(256),
    Command NVARCHAR(128),
    CPUTime INT,
    DiskIO BIGINT,
    LastBatch VARCHAR(20),
    ProgramName NVARCHAR(128),
    RequestId INT,
    CONSTRAINT PK_HistoricoProcessos PRIMARY KEY(IdHistorico)
)
GO

Listagem 1: Script para a criação da tabela HistoricoProcessos

Na Imagem 1 é possível observar o resultado da execução da procedure sp_who2, a partir do SQL Server Management Studio:

retorno_procs_01
Imagem 1. Resultado da execução da procedure sp_who2

Já na Listagem 2 está o conjunto de instruções que permitirá a transferência dos dados gerados por sp_who2 para a tabela HistoricoProcessos:

  • Inicialmente é verificada a existência de uma tabela temporária chamada “#TMP_HistoricoProcessos”. Caso a mesma tenha sido criada anteriormente, a estrutura correspondente será removida;
  • Em seguida a tabela #TMP_HistoricoProcessos é gerada, através de um comando CREATE TABLE. A definição deste objeto segue a estrutura exata dos dados retornados por sp_who2 (se isto não acontecesse, ocorreriam erros durante a inclusão das informações);
  • O próximo passo consiste em inserir informações na tabela #TMP_HistoricoProcessos. Isto acontece a partir do uso de uma cláusula INSERT, em conjunto com um comando EXEC para invocar a procedure sp_who2;
  • Um segundo comando INSERT é então executado, de forma a transferir dados de #TMP_HistoricoProcessos para a tabela HistoricoProcessos;
  • Por fim, a tabela temporária #TMP_HistoricoProcessos é eliminada, a fim de liberar recursos no servidor SQL Server.
DECLARE @DATA_ATUAL DATETIME = GETDATE()

IF OBJECT_ID('tempdb..#TMP_HistoricoProcessos') IS NOT NULL
    DROP TABLE #TMP_HistoricoProcessos

CREATE TABLE #TMP_HistoricoProcessos
(
    SPID SMALLINT,
    Status NCHAR(30),
    Login NVARCHAR(128),
    HostName NVARCHAR(128),
    BlkBy NVARCHAR(128),
    DBName NVARCHAR(256),
    Command NVARCHAR(128),
    CPUTime INT,
    DiskIO BIGINT,
    LastBatch VARCHAR(20),
    ProgramName NVARCHAR(128),
    SPID_2 SMALLINT,
    RequestId INT
)

INSERT INTO #TMP_HistoricoProcessos
EXEC dbo.sp_who2

INSERT INTO dbo.HistoricoProcessos
(
    DtHistorico,
    SPID,
    Status,
    Login,
    HostName,
    BlkBy,
    DBName,
    Command,
    CPUTime,
    DiskIO,
    LastBatch,
    ProgramName,
    RequestId
)
SELECT
    DtHistorico = @DATA_ATUAL,
    SPID,
    Status,
    Login,
    HostName,
    BlkBy,
    DBName,
    Command,
    CPUTime,
    DiskIO,
    LastBatch,
    ProgramName,
    RequestId
FROM #TMP_HistoricoProcessos

DROP TABLE #TMP_HistoricoProcessos

Listagem 2: Instruções para preenchimento da tabela HistoricoProcessos

Na Imagem 2 está o resultado de uma consulta simples aos dados que foram incluídos na tabela HistoricoProcessos:

retorno_procs_02
Imagem 2. Resultado de uma consulta à tabela HistoricoProcessos

Conclusão

Procurei demonstrar neste artigo como dados produzidos por stored procedures podem ser armazenados em tabelas no SQL Server. Embora um procedimento extremamente simples, algumas ressalvas devem ser feitas quanto a este tipo de ação: modificações na maneira como as informações são retornadas por uma procedure levarão, quase que invariavelmente, a alterações em instruções que transfiram tais dados a uma tabela.

Espero que este conteúdo possa ser útil a você em algum momento. Até uma próxima oportunidade!

Links

sp_who (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms174313.aspx

sys.sysprocesses (Transact-SQL)
http://msdn.microsoft.com/pt-br/library/ms179881.aspx

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios