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ódigoselect
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ódigoand ---<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!!