Em versões anteriores ao SQL Server 2008 não é possível utilizar tabelas como parâmetro de Stored Procedures. Quando temos de enviar múltiplos dados para o banco de dados, acabamos por enviar tais dados um de cada vez, linha por linha, orientados por um laço de repetição. O SQL Server 2008 proporciona um contorno para esta solução através do uso de Table-Valued Parameters. Os Table-Valued Parameters permitem a passagem de tabelas como parâmetro para Stored Procedures.
Para a utilização deste recurso é necessário seguir um conjunto de passos, vou enumerá-los a seguir:
1 – Tipo dados de tabela
A primeira coisa a se fazer é criar um tipo de dados de tabela (table type). Para a criação deste tipo de dados deve-se utilizar a seguinte sintaxe.
CREATE TYPE dbo.PointAttention AS TABLE
(
Id int NOT NULL,
Description varchar(100) NOT NULL,
Date datetime NOT NULL,
PRIMARY KEY (Id)
)
GO
2 – Trabalhando com o tipo de dados de tabela
Para utilizar este tipo de dados, na sintaxe Transaction-SQL, é preciso criar uma variável deste tipo de dados e então valorizá-la como se fosse uma tabela.
DECLARE @varPoint PointAttention
INSERT INTO @varPoint(Id,Description,Date)
VALUES (100,’Alerta de segurança 1′,’2011-01-20′),
(101,’Alerta de segurança 2′,’2011-01-20′),
(102,’Alerta de segurança 3′,’2011-01-20′),
(103,’Alerta de segurança 4′,’2011-01-20′),
(104,’Alerta de segurança 5′,’2011-01-20′)SELECT * FROM @varPoint
Assim como qualquer outra tabela, variáveis desse tipo podem ser utilizadas para popular outras tabelas ou servirem em clausulas JOIN dentro de comandos de seleção.
* Observação: por ser uma variável, será limpa da memória automaticamente assim que o escopo de execução for concluído, não consumindo recursos além daqueles necessários durante seu bloco de execução.
3 – Utilizando tipos de dados tabela como parâmetro de Stored Procedures
Agora vamos ao ponto focal deste texto, que é receber uma estrutura de tabela como parâmetro de uma Stored Procedure.
Para execução do exemplo, criemos uma tabela que possua uma estrutura semelhante a do nosso tipo de dados tabela.
CREATE TABLE dbo.tbPointAttention
(
pntId int NOT NULL PRIMARY KEY,
pntDescr varchar(20) NOT NULL,
pntDate datetime NOT NULL
)
GO
Agora, para construção da Stored Procure mantemos a mesma sintaxe, apenas incluindo um parâmetro com o mesmo tipo de dados de tabela criado anteriormente.
CREATE PROC spInsertPAttention @PAttentions PointAttention READONLY
AS
INSERT INTO tbPointAttention
(pntID, pntDescr, pntDate)
SELECT ID,Description,Date
FROM @PAttentions
GO
4 – Consumindo tipos de dados tabela através de aplicações .Net
O ponto chave de utilização deste novo tipo de estrutura é a utilização do tipo de dado SqlDbType.Structured (presente no namespace System.Data.SQLClient, disponível a partir do Microsoft .Net Framework 3.5).
O exemplo abaixo demonstra como essa interação pode ser codificada utilizando C#.
Vantagens da utilização de Table-Valued Parameters:
– Simplificação da lógica do projeto;
– Permite aos desenvolvedores construírem aplicações performáticas;
Referências:
http://msdn.microsoft.com/en-us/library/bb510489.aspx
http://msdn.microsoft.com/en-us/library/bb675163.aspx
http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters
Por
Fernando Henrique Inocêncio Borba Ferreira.