none
select com conversão de string p/ inteiro RRS feed

  • Pergunta

  • tenho uma tabela que está cadastrada em uma coluna dois códigos de produto.

    tabela1:
    coluna1  --essa coluna é do tipo varchar
    1,2

    eu preciso fazer um select na tabela de produto com essas códigos. tipo assim: select * from produto where cod_produto in (coluna1). porém, me dá erro de conversão de inteiro para varchar.
    o cod_produto na tabela produto é inteiro. 

    não estoou conseguinte fazer a conversão para inteiro da coluna1 (da tabela1). é por causa da vírgula. alguém sabe como posso fazer?
    terça-feira, 13 de novembro de 2012 14:10

Respostas

  • Voce pode fazer esse select atraves de uma variavel,ex:

    create table #temp (cod_produto int)
    
    insert into #temp
    select 1
    insert into #temp
    select 2
    insert into #temp
    select 3
    
    
    declare
     @id varchar(100)
     
    set @id = '1,2'
    
    Declare @sql varchar(8000)
    set @sql = 'select * from #temp where cod_produto in (' + @id + ')'
    exec (@sql)


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta rafa-martin terça-feira, 13 de novembro de 2012 14:46
    terça-feira, 13 de novembro de 2012 14:40
  • Você poderia tambem concatenar todos os valores da tabela e depois aplicar o select dinamico com o in

    Ex:

    create table #tabela (Cod_produto int)
    create table #Temp (Cod_produto varchar(20))
    insert into #tabela
    values (1),(2),(3),(4),(5),(6)
    insert into #Temp
    values ('1,2,3'),('2,5'),('3,4'),('4,7')
    declare @sql varchar(8000)
    declare @cod_Produto varchar(200)
    ;WITH CTE_VALOR AS(
    --CONCATENA OS VALORES DA TABELA
    SELECT (SELECT CAST(Cod_produto AS VARCHAR(10)) + ',' AS [text()]
    		FROM #Temp AS O
    		FOR XML PATH(''), TYPE).value('.[1]', 'VARCHAR(MAX)') AS VALOR
    )SELECT @cod_Produto =  LEFT(VALOR,LEN(VALOR)-1) FROM CTE_VALOR
    set @sql = 'select * from #tabela where cod_produto in (' + @cod_Produto + ')'
     
    exec (@sql)


    [ ]´s,
    Lukas Baldan

    • Marcado como Resposta rafa-martin terça-feira, 13 de novembro de 2012 17:47
    terça-feira, 13 de novembro de 2012 17:42

Todas as Respostas

  • Para realizar a conversão dos tipos você pode utilizar a função CAST como abaixo:

    CAST(Coluna_VarChar AS int)

    Acredito que no select ficaria mais ou menos assim:

    select * from produto where cod_produto in (CAST(coluna1 as int))

    terça-feira, 13 de novembro de 2012 14:25
  • marco eu sei que posso usar cast ou varchar. vou te dar um exemplo:

    declare
    @id varchar(100)

    set @id = '1,2'

    select * from tabela1 where cod_produto in (@id)


    nesse caso vai me retornar o seguinte erro: Conversion failed when converting the varchar value '1,2' to data type int.

    isso porque o meu campo cod_produto é inteiro na tabela tabela1. 

    então preciso converter a variável @id em int para que eu consiga realizar  a consulta que ficaria assim: select * from tabela1 where cod_produto in (1,2).

    só que não estou conseguindo e é por causa da vírgula.

    entendeu o que preciso?


    terça-feira, 13 de novembro de 2012 14:34
  • Voce pode fazer esse select atraves de uma variavel,ex:

    create table #temp (cod_produto int)
    
    insert into #temp
    select 1
    insert into #temp
    select 2
    insert into #temp
    select 3
    
    
    declare
     @id varchar(100)
     
    set @id = '1,2'
    
    Declare @sql varchar(8000)
    set @sql = 'select * from #temp where cod_produto in (' + @id + ')'
    exec (@sql)


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta rafa-martin terça-feira, 13 de novembro de 2012 14:46
    terça-feira, 13 de novembro de 2012 14:40
  • então só que eu precisava fazer uma coisa mais ou menos assim:

    select * from tabela cod_produto in (select id from #temp)

    porque  na taminha tabela #temp existem a coluna id é varchar. porque está cadastrado assim:

    coluna1 da tabela #temp
    1,2,3
    2,5
    3,4

    e assim por sucessivamente. por isso eu precisava  fazer esse select * from tabela cod_produto in (select id from #temp) ou de preferencia um join entre essas tabelas.

    entendeu?
    terça-feira, 13 de novembro de 2012 17:06
  • Acho que não vai ser tão simples fazer o que voce quer, por que não da para comparar diretamente '1' = '1,2,3', vejo 3 opções, voce alterar a estrutura para ficar somente 1 item por registro dai a comparação ficaria sendo sempre de 1 para 1, mas como acho que isso vai levar um tempo devido as regras de sua aplicação, ou voce faz algum esquema de fazer isto  na sua temporaria fazendo o efeito de 1 para 1, ou faz um looping utilizando a logica abaixo, onde vai ter uma variavel que vai ler linha a linha de sua temporaria (não da para atribuidir mais de uma linha para a variavel) e insere em outra temporaria e depois faz o select do total.

    create table #tabela (Cod_produto int)
    create table #Temp (Cod_produto varchar(20))
    
    insert into #tabela
    values (1),(2),(3),(4),(5),(6)
    
    insert into #Temp
    values ('1,2,3'),('2,5'),('3,4'),('4,7')
    
    declare @sql varchar(8000)
    declare @cod_Produto varchar(200)
    set @cod_Produto = (select top 1 Cod_produto from #temp)
    
    set @sql = 'select * from #tabela where cod_produto in (' + @cod_Produto + ')'
     
    exec (@sql)


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 13 de novembro de 2012 17:27
  • Você poderia tambem concatenar todos os valores da tabela e depois aplicar o select dinamico com o in

    Ex:

    create table #tabela (Cod_produto int)
    create table #Temp (Cod_produto varchar(20))
    insert into #tabela
    values (1),(2),(3),(4),(5),(6)
    insert into #Temp
    values ('1,2,3'),('2,5'),('3,4'),('4,7')
    declare @sql varchar(8000)
    declare @cod_Produto varchar(200)
    ;WITH CTE_VALOR AS(
    --CONCATENA OS VALORES DA TABELA
    SELECT (SELECT CAST(Cod_produto AS VARCHAR(10)) + ',' AS [text()]
    		FROM #Temp AS O
    		FOR XML PATH(''), TYPE).value('.[1]', 'VARCHAR(MAX)') AS VALOR
    )SELECT @cod_Produto =  LEFT(VALOR,LEN(VALOR)-1) FROM CTE_VALOR
    set @sql = 'select * from #tabela where cod_produto in (' + @cod_Produto + ')'
     
    exec (@sql)


    [ ]´s,
    Lukas Baldan

    • Marcado como Resposta rafa-martin terça-feira, 13 de novembro de 2012 17:47
    terça-feira, 13 de novembro de 2012 17:42