Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 516272
            [titulo] => subquery com substring
            [dataCadastro] => DateTime Object
                (
                    [date] => 2015-04-09 17:19:31
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 262490
            [status] => A
            [isExample] => 
            [NomeUsuario] => Marisiana Battistella
            [Apelido] => Marisiana
            [Foto] => 262490_20141229171421.jpg
            [Conteudo] => Simone, verifique se essa instrução executa corretamente:
[code]select
CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
SUBSTRING (dados, 10, 2) AS 'Produto',
SUBSTRING (dados, 12,14) AS 'Unidade' ,
CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1
where SUBSTRING(dados, 1,2) = 'TC'
and CONVERT (INT, SUBSTRING (tb1.dados, 46,9) not in (select COD_CARGO from tb2)[/code]
Em seguida, corrija a instrução no subselect para que atenda a regra em questão e retorne apenas os códigos que cargos que vc precisa q retorne. ) )

subquery com substring

Dbajr
   - 09 abr 2015

Bom dia pessoal,
Tenho um select que me retorna alguns dados de um arquivo txt, preciso inserir mensalmente esses dados numa tabela. Não são dados que são alterados com frequença, porem pode ser que algum momento, seja feita inclusão de dados novos.

Estou tentando fazer as seguinte subquery e me retorna 0, sendo que deveria inserir 1 linha na tabela .
#Código

insert into tb2 (nome, produto,unidade)
select
 
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' ,

from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and not exists (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9))


Voces saberiam me dizer o que está errado.

Post mais votado

Marisiana
   - 09 abr 2015

Simone, verifique se essa instrução executa corretamente:
#Código

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
where SUBSTRING(dados, 1,2) = 'TC'
and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)  not in (select COD_CARGO from tb2)

Em seguida, corrija a instrução no subselect para que atenda a regra em questão e retorne apenas os códigos que cargos que vc precisa q retorne.

Marcos P
   - 09 abr 2015

#Código

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'


Retorna registros ?

Se retornar, fica faltando a ligação entre as tabelas "t1" e "t2" na subquery

#Código
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and not exists (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9) and tb1.chave = tb2.chave)


ou a referência da subquery a alguma coluna na tabela principal
#Código

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
   and cargo = (select NOME from tb2  where ID_CARGO  not in (1,2,3,4,5,6,7,9))

Dbajr
   - 09 abr 2015

Oi Marcos,
O primeiro select retorna valor sim, havia esquecido de uma linha do select.
Tentei fazer o seu ultimo codigo, aparece que 1 linha foi inserida, mas no caso 2 linhas deveria ser inseridas.

Ficou assim

#Código


insert into tb2
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
    and CONVERT (INT,SUBSTRING (dados, 46,9)) = (select COD_CARGO from  tb2  where COD_CARGO  not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521))


Marcos P
   - 09 abr 2015

Concentre-se primeiro no select, para depois resolver o insert...

#Código

select COD_CARGO from  tb2  where COD_CARGO  not in (5491,5491,5492,5492,5493,5494,5495,5496,5498,5520,5521)

Retorna quantas linhas ?

Dbajr
   - 09 abr 2015

Não retorna nada no select.

Marcos P
   - 09 abr 2015

Então, todo seu select não vai funcionar....

Comece revisando esse select da subquery !

Dbajr
   - 09 abr 2015

Então, acho meu raciocínio estava errado.
Eu preciso inserir na tb2 apenas os registros que contem na tb1 e nao contem na tb2.
Seria isso ..?

#Código


Insert into tb2
select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2)



Marcos P
   - 09 abr 2015

Qual o campo chave entre as duas tabelas ?

Sabendo isso, ajuste para :

#Código

:
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2 and tb1.chave = tb2.chave)

Dbajr
   - 09 abr 2015

a tb1 não tem chave, como a utilizo pra importar dados de um arquivo txt, ela tem apenas 2 colunas "linhas" e "id."
Uso o seguinte comando, pra pegar apenas os dados necessários.
Onde eu consigo verificar o codigo do cargo é na ultima linha, porem acho que não é possivel utiliza - lo no campo chave
, estou correta?

#Código

  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'

Marcos P
   - 09 abr 2015

Mas existe alguma lógica na relação entre elas, certo ?

Se for por "codigo", assumindo que tb1 é a tabela com os dados do TXT, faça...

#Código

:
from tb1  
  where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb2 and CONVERT (INT,SUBSTRING (tb1.dados, 46,9)) = tb2.codigo)


Senão, use o mesmo raciocínio para os campos que suportam a ligação entre essas tabelas !

Dbajr
   - 09 abr 2015

Sim o código é a relação.
Fiz como indicou e esta aparecendo a mensagem que o and proximo ao CONVERT esta incorreto, e o tb2 do insert into também.

Marisiana
   - 09 abr 2015

Qual é o campo que vc deve utilizar para comparar com os códigos de cargos retornados no subselect?
#Código

and ---<aqui deve ter o o campo q contém a informação que será comparado com os valores retornados no subselect>---
                    not exists (select COD_CARGO from tb2)

Dbajr
   - 09 abr 2015

Então, o campo na tb1 seria o CONVERT (INT, SUBSTRING (tb1.dados, 46,9) mesmo, porem esta dando erro no "and",

#Código

where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb_CARGO and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)) = tb2.COD_CARGO)

Marcos P
   - 09 abr 2015

Esqueça o insert... ele não vai funcionar enquanto o select não funcionar !

Conhece do Fiddler ?

É um serviço web que você pode criar bases de dados para fins de depuração e testes de scripts sql.

Veja esse exemplo que preparei em outro post, o que pode ser feito com ele... http://sqlfiddle.com/#!6/8a050/2

Se você puder, crie alguns registros lá, que podemos trabalhar na query juntos.

Marisiana
   - 09 abr 2015

Veja se esse select funciona...
#Código

select  
  CONVERT (INT,SUBSTRING (dados, 3, 7)) AS 'nome',
  SUBSTRING (dados, 10, 2) AS 'Produto',
  SUBSTRING (dados, 12,14) AS 'Unidade' , 
  CONVERT (INT,SUBSTRING (dados, 46,9)) AS 'codigo'
from tb1  
where SUBSTRING(dados, 1,2) = 'TC'
and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)  not exists (select COD_CARGO from tb2)

Marisiana
   - 09 abr 2015

Não sei se funciona no SQLServer, mas tenta utilizar NOT IN no lugar de NOT EXISTS

Marcos P
   - 09 abr 2015

Esse "and" que você colocou está errado...

#Código

:
where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb_CARGO and CONVERT (INT, SUBSTRING (tb1.dados, 46,9)) = tb2.COD_CARGO)


Troque- por "WHERE"...

#Código
:
where SUBSTRING(dados, 1,2) = 'TC'
  and not exists (select COD_CARGO from tb_CARGO WHERE CONVERT (INT, SUBSTRING (tb1.dados, 46,9)) = tb2.COD_CARGO)

Dbajr
   - 10 abr 2015

Usei o exemplo da Marisiana e deu certo!
Obrigada pela atenção pessoal.

Marcos P
   - 10 abr 2015

Ótimo !!!

Marisiana
   - 10 abr 2015

Por nada Simone!!