Usuário com melhor resposta
Passagem de parametro com in

Pergunta
-
Olá Pessoal!
Tenho um select em uma precedure com a seguinte condição:
where codigo in(@codigo)
O problema é que essa variável é do tipo char e vem com os códigos agrupados: 1,2,3,78,145
Quando vou executar: exec nome_procedure '1,2,3,78,145'
A procedure dá erro de conversão de inteiro para char.
Algém tem alguma sugestão????
Obrigada
Respostas
-
Olá Tassiana,
Essa dúvida é recorrente aqui no fórum. Você poderá encontrar muitas informações sobre soluções em posts anteriores (uma das opções é fazer um split). Opcionalmente você pode usar uma SQL dinâmica. Ex:
DECLARE @cmdSQL NVARCHAR(200)
SET @cmdSQL = 'SELECT QualquerCoisa FROM AlgumObjeto WHERE Codigo IN (' + @codigo + ')'
EXEC sp_executesql @statement = @cmdSQL
[ ]s,
Gustavo
Todas as Respostas
-
Olá Tassiana,
Essa dúvida é recorrente aqui no fórum. Você poderá encontrar muitas informações sobre soluções em posts anteriores (uma das opções é fazer um split). Opcionalmente você pode usar uma SQL dinâmica. Ex:
DECLARE @cmdSQL NVARCHAR(200)
SET @cmdSQL = 'SELECT QualquerCoisa FROM AlgumObjeto WHERE Codigo IN (' + @codigo + ')'
EXEC sp_executesql @statement = @cmdSQL
[ ]s,
Gustavo
-
-
Cara Tassiana,
Segue uma função para separar um array,
Code SnippetSET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE FUNCTION FN_RETORNA_ARRAY
( @ARRAY VARCHAR(1000) )
RETURNS @TB_ARRAY TABLE
(ITEM VARCHAR(40))
AS
BEGINDECLARE @C INT
SELECT @C = PATINDEX('%,%',@ARRAY)
IF @C = 0
BEGIN
INSERT INTO @TB_ARRAY VALUES(@ARRAY)
RETURN
ENDWHILE @C <> 0
BEGIN
INSERT INTO @TB_ARRAY
SELECT SUBSTRING(@ARRAY,1,PATINDEX('%,%',@ARRAY)-1)
SELECT @ARRAY = SUBSTRING(@ARRAY,PATINDEX('%,%',@ARRAY)+1,LEN(@ARRAY)-PATINDEX('%,%',@ARRAY))
SELECT @C = PATINDEX('%,%',@ARRAY)
ENDINSERT @TB_ARRAY VALUES(@ARRAY)
RETURN
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GOBasta alterar seu where da seguinte maneira.
Where codigo in ( select * from dbo.FN_RETORNA_ARRAY(@CODIGO))
Espero que tenha ajudado.
[]'s
Rafael Krisller
-
Você pode tentar da seguinte forma
sua variavel que recebe é um char, dai vc faz o seguinte
create nome_procedure@codigo char(tamanho) --> Eu trocaria pra varchar(xxx)
with recompile
as
begin
Set @codigo = ',' + convert(varchar(tamanho), @codigo) + ','
--> dai ele teria o seguinte valor ",1,2,3,78,145,"
Select * from tabela
where charindex(',' + convert(varchar, codigo) + ',' , @codigo) > 0
end
Wander Junior
- Sugerido como Resposta Wander luz terça-feira, 10 de novembro de 2009 02:36
-
Olá Wander,
Sua solução parece ser interessante mas você já a testou para grandes volumes de dados ? Acredito que o fato dela ter um predicado pouco convencional usando o CHARINDEX irá denegrir o desempenho uma vez que nenhum índice poderá satisfazê-la. As demais soluções podem usufruir de um índice na coluna codigo
[ ]s,
Gustavo
-
Bom Dia Gustavo !!!
Atualmente o nosso sistema roda muito bem..., temos no sistema uma tabela com 18 Milhões de Registros e mais de 200 usuarios conectados ao mesmo tempo. Nunca testamos esse tipo de consulta na WEB, pois estamos começando a desenvolver algumas funcionalidade pra WEB, agora.
Não saberia te dizer com seria a perfomace na WEB, mas client/server todos os tipos de testes já foram feitos.
Tbem temos um sistema que calcula a folha de pagamento do Governo do Estado Rondonia, onde são mais de 62 mil funcionários, não sei te dizer exatamente, mas com certeza são mais de 18 milhoes de linhas no financeiro.
Wander Junior
wander_luz@hotmail.com
- Sugerido como Resposta Wander luz terça-feira, 10 de novembro de 2009 02:37
-
se for sql 2005 eu acho que uma variavel xml pode ficar bem melhor, mais tenho outro exemplo de array diferente, que nao e dos mais performaticos mais funciona bem ...
segue
CREATE Function Ufn_TableArray (@VarArray Varchar(8000))
Returns @TableArray Table (Item varchar(50)) AS
BEGIN
If @VarArray Is null
INSERT INTO @TableArray (Item) VALUES (Null)
Declare @Indice AS TinyInt
Declare @IndiceArray AS TinyInt
Declare @VarAcum AS nvarchar(10)SET @VarArray = @VarArray + ','
SET @VarAcum = ''
SET @Indice = 1
SET @IndiceArray = 0WHILE @Indice <= Len(@VarArray)
BEGIN
IF Substring(@VarArray,@Indice,1) = ','
BEGIN
INSERT INTO @TableArray (Item) VALUES (@VarAcum)
SET @VarAcum = ''
END
ELSE
BEGIN
SET @VarAcum = rtrim(Convert(char(10),@VarAcum)) + rtrim(convert(char(10),Substring(@VarArray,@Indice,1)))
END
SET @Indice = @Indice+1
ENDRETURN
END
Abs;
-
Wander Junior wrote: Você pode tentar da seguinte forma
sua variavel que recebe é um char, dai vc faz o seguinte
create nome_procedure@codigo char(tamanho) --> Eu trocaria pra varchar(xxx)
with recompile
as
begin
Set @codigo = ',' + convert(varchar(tamanho), @codigo) + ','
--> dai ele teria o seguinte valor ",1,2,3,78,145,"
Select * from tabela
where charindex(',' + convert(varchar, codigo) + ',' , @codigo) > 0
end
Wander Junior
Solução perfeita essa do Wander
Simples e direta.
Parabéns! Funcionou perfeitamente aqui.
Um abraço,
Alexey -
outro exemplo
-- create table #Exemplo (campo int)
insert into #Exemplo (campo) Values (1)
insert into #Exemplo (campo) Values (2)
insert into #Exemplo (campo) Values (4)Declare @Find Varchar(1000)
Select @Find = '[125]'
Select * From #Exemplo where PatIndex('%'+@Find+'%',Convert(Varchar(02),campo))>0