Matérias‎ > ‎

Múltiplos valores em um parâmetro de uma Stored Procedure (T-SQL)

postado em 7 de jun de 2010 15:01 por João Miguel Tabosa Vaz Marques Silva   [ 7 de jun de 2010 16:15 atualizado‎(s)‎ ]
Desenvolvendo um software para um cliente eu tive alguns problemas pois o mesmo queria que em um determinado relatório fosse passado n quantidades de "Canais" na geração do relatório. Bem nada complicado para o SQL Server lidar já que tudo é interligado por chaves estrangeiras, porem como eu poderia facilmente passar os valores selecionados em uma caixa de seleção múltipla como parâmetro para um Stored Procedure? Bem até ai pensei, fácil basta passar tudo junto como string Ex: "1,15,36,120,17" até ai muito fácil... Porem como tratar isso no SQL Server para que eu pudesse usar isso em um WHERE IN? Ai sim é que foram elas... Para tal eu desenvolvi baseado e algumas idéias na internet uma função que recebe isso como string e devolve como uma tabela de de uma coluna BIGINT que posso facilmente usar em um WHERE IN... Sendo assim eu simplesmente uso a função desta forma:
SELECT Id FROM func_QuebraVarcharIds("1,15,36,120,17",",") 
Como primeiro parâmetro passei tudo que precisava usando um separador, neste caso ",". No segundo parâmetro passei qual é o separador, neste caso novamente ",".Vejam agora o código da função:

Código Função "func_QuebraVarcharIds"

CREATE FUNCTION [dbo].[func_QuebraVarcharIds]
(
	@ListaIds varchar(max),
	@Delimitador varchar(1)
)
RETURNS @TabelaIds TABLE (Id bigint)
AS
BEGIN

	DECLARE @ListaIdsTemporaria varchar(max)
	SET @ListaIdsTemporaria = @ListaIds

	DECLARE @Indice INT
	DECLARE @Id varchar(max)

	SET @ListaIdsTemporaria = REPLACE (@ListaIdsTemporaria, ' ','')
	SET @Indice = CHARINDEX(@Delimitador, @ListaIdsTemporaria)

	WHILE (LEN(@ListaIdsTemporaria) > 0)
	BEGIN
		
		IF @Indice = 0
			SET @Id = @ListaIdsTemporaria
		ELSE
			SET @Id = LEFT(@ListaIdsTemporaria, @Indice - 1)
			
		INSERT INTO @TabelaIds(Id) VALUES(CONVERT(bigint,@Id))
		
		IF @Indice = 0
			SET @ListaIdsTemporaria = ''
		ELSE
			SET @ListaIdsTemporaria = RIGHT(@ListaIdsTemporaria, LEN(@ListaIdsTemporaria) - @Indice)
			
		SET @Indice = CHARINDEX(@Delimitador, @ListaIdsTemporaria)
		
	END

	RETURN

END
Bem, espero ter ajudado. Abraços e até mais...
ċ
func_QuebraVarcharIds.sql
(1k)
João Miguel Tabosa Vaz Marques Silva,
7 de jun de 2010 16:15
Comments