Usuário com melhor resposta
select com conversão de string p/ inteiro

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?
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
-
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
Todas as Respostas
-
-
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?
-
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
-
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? -
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.
-
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