Os aplicativos de banco de dados do mundo real precisam fazer várias solicitações do front-end ao banco de dados para realizar todos os tipos de funções.
Se um aplicativo for intensivo em dados, como os usados em bancos ou aeroportos, etc., o número de viagens de dados pode ser enorme. Cada solicitação a um banco de dados utiliza largura de banda e requer tempo para ser executada. Sem os parâmetros com valor de tabela, um aplicativo frontal precisa fazer várias viagens de dados para manipular várias linhas de dados. No entanto, com parâmetros com valor de tabela, várias linhas podem ser inseridas, atualizadas e excluídas de um banco de dados usando um único comando parametrizado que recebe um parâmetro com valor de tabela.
Um parâmetro com valor de tabela é um parâmetro com um tipo de tabela. Usando esse parâmetro, você pode enviar várias linhas de dados para um procedimento armazenado ou um comando SQL parametrizado na forma de uma tabela. O Transact-SQL pode ser usado para acessar os valores de coluna dos parâmetros com valor de tabela.
Neste artigo, estudaremos como podemos passar uma tabela de dados para um procedimento armazenado. No entanto, antes disso, vamos ver como os dados tabulares costumavam ser passados antes dos parâmetros com valor de tabela.
Passando dados em formato tabular antes dos parâmetros com valor de tabela
Os parâmetros com valor de tabela foram introduzidos no SQL Server 2008. Antes disso, havia opções limitadas para passar dados tabulares para procedimentos armazenados. A maioria dos desenvolvedores usou um dos seguintes métodos:
- Os dados em várias colunas e linhas foram representados na forma de uma série de parâmetros. No entanto, o número máximo de parâmetros que podem ser passados para um procedimento armazenado do SQL Server é 2.100. Portanto, no caso de uma tabela grande, esse método não pode ser usado. Além disso, o pré-processamento é necessário no lado do servidor para formatar os parâmetros individuais em uma forma tabular.
- Crie várias instruções SQL que podem afetar várias linhas, como UPDATE. As declarações podem ser enviadas ao servidor individualmente ou na forma em lote. Mesmo que sejam enviados em lote, os comandos são executados individualmente no servidor.
- Outra maneira é usar strings delimitadas ou documentos XML para agrupar dados de várias linhas e colunas e, em seguida, passar esses valores de texto para instruções SQL parametrizadas ou procedimentos armazenados. A desvantagem dessa abordagem era que você precisava validar a estrutura de dados para separar os valores.
Passando tabela de dados como parâmetro para procedimentos armazenados
Agora vamos ver como os parâmetros com valor de tabela podem ser usados para enviar dados para um procedimento armazenado sem enfrentar nenhum dos problemas discutidos na seção anterior. Os parâmetros com valor de tabela permitem que várias linhas de dados sejam passadas para um procedimento armazenado por algum código Transact-SQL ou de um aplicativo front-end. O tamanho máximo que um parâmetro com valor de tabela pode ter é igual ao tamanho máximo de memória do servidor de banco de dados.
Nesta seção, usaremos parâmetros com valor de tabela junto com um procedimento armazenado para inserir várias linhas em uma tabela de dados.
A passagem de parâmetros com valor de tabela para um procedimento armazenado é um processo de três etapas:
- Crie um tipo de tabela definido pelo usuário que corresponda à tabela que você deseja preencher.
- Passe a tabela definida pelo usuário para o procedimento armazenado como um parâmetro
- Dentro do procedimento armazenado, selecione os dados do parâmetro passado e insira-os na tabela que você deseja preencher.
Vamos dar uma olhada em um exemplo de como podemos passar uma tabela de dados para um procedimento armazenado usando uma função com valor de tabela.
Primeiro, crie uma tabela que queremos preencher. Execute o seguinte script:
CREATE DATABASE ShowRoom USE ShowRoom Create Table Cars ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
No script acima, criamos um banco de dados chamado ShowRoom com uma tabela, ou seja, Cars. A tabela Carros tem três colunas:ID, Nome e empresa. Usaremos um procedimento armazenado para preencher a tabela Carros.
Conforme descrito anteriormente, a primeira etapa é criar um tipo de tabela definido pelo usuário que corresponda à tabela que você deseja preencher. Execute o seguinte script para fazer isso:
CREATE TYPE CarTableType AS TABLE ( Id int primary key, Name nvarchar(50), company nvarchar(50) ) Go
No script acima, criamos a variável definida pelo usuário CarTableType do tipo Table. Esta é a variável que passaremos para o procedimento armazenado. Pode-se ver que as colunas da variável CarTableType são semelhantes às da tabela Carros.
Agora vamos criar um procedimento armazenado que aceite a variável CarTableType como parâmetro. Dentro do procedimento armazenado, vamos SELECIONAR todos os registros desta variável e inseri-los na tabela Carros. Execute o seguinte script para criar tal procedimento armazenado:
CREATE PROCEDURE spInsertCars @CarType CarTableType READONLY AS BEGIN INSERT INTO Cars SELECT * FROM @CarType END
No script acima, criamos o procedimento armazenado spInsertCars. É importante mencionar que você deve especificar o parâmetro definido pelo usuário como READONLY dentro do procedimento armazenado, caso contrário, resultará em um erro de tempo de execução.
Você pode ver que o procedimento armazenado spInsertCars aceita o parâmetro CarTableType e o atribui à variável @CarType do tipo CarTableType.
A etapa final é criar uma variável da variável CarTableType, preenchê-la com dados fictícios e passá-la para o procedimento armazenado spInsertCars. Dê uma olhada no script a seguir:
DECLARE @CarTableType CarTableType INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota') INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda') INSERT INTO @CarTableType VALUES (3, '6', 'Audi') INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez') INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford') EXECUTE spInsertCars @CarTableType
No script acima, primeiro declaramos a variável @CarTableType do tipo CarTableType. Em seguida, inserimos 5 registros fictícios nessa variável. Por fim, executamos o procedimento armazenado spInsertCars e passamos a variável @CarTableType como parâmetro.
Dentro do procedimento armazenado, cinco registros da variável @CarTableType são selecionados e inseridos na tabela Carros. Agora, se você selecionar todos os registros da tabela Carros, deverá ver os registros recém-inseridos. Execute o seguinte script para fazer isso:
SELECT * FROM Cars
A saída do script acima é assim:
Pode-se ver na saída que todos os registros da variável @CarTableType foram inseridos na tabela Carros.