Usuário com melhor resposta
Union - Sql 2008

Pergunta
-
bom dia a todos, prezados vejam que estranho, ou erro eu mesmo,
SELECT F.CODFUNCAO,
'0'FROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO = '02'
UNIONSELECT '0',
F.CODFUNCAOFROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO <> '02'Resultado
0 000119
000339 0para inicio esta correto, porem quanto eu faço conforme abaixo colocando data ele me retorna mensagem de erro, vejam
SELECT F.CODFUNCAO,
'0',
F.DTMUDANÇA,
'0'FROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO = '02'
UNIONSELECT '0',
F.CODFUNCAO,
'0',
F.DTMUDANCAFROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO <> '02'
Mensagem de erro.
Msg 241, Level 16, State 1, Line 2
Conversion failed when converting datetime from character string.
prezados no 2005 eu conseguia fazer isso, muito estranho, obrigado pela ajuda
Respostas
-
Ronnie,
Vou tentar explicar melhor o que falei antes...
O UNION faz a junção de duas ou mais tabelas, obedecendo as seguintes regras:- Os SELECTS ligados pelo UNION devem retornar a mesma quantidade de colunas;
- As colunas com a mesma posição no SELECT devem possuir o mesmo tipo de dados.
No seu primeiro SELECT, na terceira coluna você exibe um campo DATA e no segundo SELECT, na terceira coluna também (ou seja, na mesma posição da segunda) você tentou exibir um campo STRING. Daí veio o erro...
Quando você coloca o NULL como fez acima, não há conflitos de tipos de campos (já que NULL não é um tipo) e por isso funcionou.
Na imagem abaixo destaquei em vermelho e verde onde está seu problema.
Espero ter ajudado =)
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:53
-
Ronnie,
Os tipos dos campos das duas tabelas devem ser do mesmo tipo.
Se você olhar seus selects, vai ver que está tentando unir DATETIME com VARCHAR (3º campo do SELECT) e VARCHAR com DATETIME (4º campo do SELECT)1º SELECT
F.CODFUNCAO, '0', F.DTMUDANÇA, '0'2º SELECT
'0', F.CODFUNCAO, '0', F.DTMUDANCA
Espero ter ajudado.Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Eduardo Gomes Pereira quarta-feira, 4 de abril de 2012 17:44
- Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:54
Todas as Respostas
-
Ronnie,
Os tipos dos campos das duas tabelas devem ser do mesmo tipo.
Se você olhar seus selects, vai ver que está tentando unir DATETIME com VARCHAR (3º campo do SELECT) e VARCHAR com DATETIME (4º campo do SELECT)1º SELECT
F.CODFUNCAO, '0', F.DTMUDANÇA, '0'2º SELECT
'0', F.CODFUNCAO, '0', F.DTMUDANCA
Espero ter ajudado.Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Eduardo Gomes Pereira quarta-feira, 4 de abril de 2012 17:44
- Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:54
-
Mariana desculpa a minha ignorancia, mas nao entendi muito bem, veja essa exe, estou tratando da mesma forma e funciona.
SELECT F.CODFUNCAO,
'0'FROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO = '02'
UNIONSELECT '0',
F.CODFUNCAOFROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO <> '02' -
Pessoa nao sei se foi a melhor forma de resolver mais consegui dessa forma, usando NULL, vejam
SELECT F.CODFUNCAO,
'0',
DTMUDANCA,
NULL
FROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO = '02'
UNIONSELECT '0',
F.CODFUNCAO,
null,
F.DTMUDANCA
FROM PFUNC AS P
INNER JOIN PFHSTFCO AS F (NOLOCK)ON F.CODCOLIGADA = P.CODCOLIGADA AND F.CHAPA = P.CHAPA
INNER JOIN PFUNCAO AS P1 (NOLOCK)ON P1.CODCOLIGADA = F.CODCOLIGADA AND P1.CODIGO = F.CODFUNCAO
WHERE P.CHAPA = '010684'
AND F.MOTIVO <> '02'
-
Ronnie,
Vou tentar explicar melhor o que falei antes...
O UNION faz a junção de duas ou mais tabelas, obedecendo as seguintes regras:- Os SELECTS ligados pelo UNION devem retornar a mesma quantidade de colunas;
- As colunas com a mesma posição no SELECT devem possuir o mesmo tipo de dados.
No seu primeiro SELECT, na terceira coluna você exibe um campo DATA e no segundo SELECT, na terceira coluna também (ou seja, na mesma posição da segunda) você tentou exibir um campo STRING. Daí veio o erro...
Quando você coloca o NULL como fez acima, não há conflitos de tipos de campos (já que NULL não é um tipo) e por isso funcionou.
Na imagem abaixo destaquei em vermelho e verde onde está seu problema.
Espero ter ajudado =)
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Marcado como Resposta Ronnie Von quinta-feira, 5 de abril de 2012 14:53
-