segunda-feira, 6 de dezembro de 2010

Passando uma lista de valores como parâmetro para uma Stored Procedure


As Stored Procedures podem aumentar consideravelmente a complexidade das pesquisas realizadas por aplicações em uma base de dados. 

O uso de parâmetros é uma das vantagens fornecidas pelas Stored Procedures. Através dos parâmetros, podemos tornar o filtro de uma consulta mais ou menos abrangente.

Em alguns casos, porém, pode ser necessário passar uma lista com tamanho indefinido de valores como parâmetro de filtro para uma pesquisa. Infelizmente, no SQL Server 2008 não é possível criar Stored Procedures com número de parâmetros variável, e não existem tipos de dados semelhantes aos vetores utilizados nas linguagens de programação convencionais.

Existem diversas formas de solucionar este problema. Uma das formas mais flexíveis de contornar esta situação é o uso de parâmetros do tipo XML.

Vamos utilizar um exemplo para entender como resolver esta situação. Utilizaremos como fonte de dados a tabela temporária Pessoa que deve conter o nome da pessoa e um código identificador (ID). Segue abaixo o código para criação da tabela:

/* Criando tabela Pessoa */
CREATE TABLE Pessoa
(
    ID int identity (1,1)
    , nome varchar(100)
)

/* Inserindo valores na tabela Pessoa */
Insert into Pessoa Values ('Evandro'),('Ronaldo'),('Rita'),('Mariana'),('Augusto')

Em seguida, criaremos uma Stored Procedure para selecionar registros desta tabela utilizando uma lista de IDs como filtro na forma de um parâmetro do tipo XML. O formato de nosso parâmetro será o seguinte:

   <id> 1 </id>
   <id> 2 </id>
          ....

No trecho abaixo, podemos verificar o código da procedure já realizando o filtro na tabela Pessoa através da lista de IDs:

/* Criando Procedure para filtro de pessoas através de uma lista de IDs */
CREATE PROCEDURE PROC_selectPessoa
    @filtroXML XML
AS
    SELECT P.ID, Nome FROM Pessoa P
    INNER JOIN   
        (
              SELECT
                   ParamValues.ID.value('.','int') as ID    
             FROM
                   @filtroXML.nodes('/id') as ParamValues(ID)
        ) F
    ON P.id = F.id
GO

Depois de criar a Stored Procedure, podemos simular a chamada realizada por uma aplicação, criando uma variável do tipo XML.

/* Simulando chamada realizada pela aplicação, passando os ids 1 e 5 */
DECLARE @parametros XML
SELECT  @parametros = '<id> 1 </id> <id> 5 </id>'
EXEC PROC_selectPessoa @parametros

Ao executar o script proposto acima, teremos o seguinte resultado:

ID Nome
1 Evandro
5 Augusto

Na figura abaixo, podemos ver nosso script em execução:


Para maiores informações sobre o tipo de dados XML, verifique outros artigos sobre o tema:

Um comentário:

Postar um comentário