Usuário com melhor resposta
Onde está o erro desta consulta?

Pergunta
-
Olá pessoal,
Utilizamos aqui o sistema TOTVS e existe uma consulta que precisamos fazer onde um determinado subselect deverá trazer vários resultados numa linha. Tentei utilizar a seguinte sentença:
DECLARE @SQLStr VARCHAR(5000) SET @SQLStr = '' SELECT NOMINAL = UPPER(A.NOMINAL), NUM_CHEQUE = CASE WHEN LTRIM(RTRIM(A.NUMERODOCUMENTO)) IS NULL THEN ( SELECT @SQLStr = @SQLStr + Z.TESTE + ' ' FROM ( (SELECT ', ', CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE FROM FBORDERO X WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA ) Z SET @SQLStr = LEFT(@SQLStr,len(@SQLStr)) SELECT @SQLStr AS Z.TESTE ELSE UPPER(A.NUMERODOCUMENTO) END, VALOR = SUM(A.VALOR), TIPO = (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO), CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO), ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', CNPJ = C.CGC FROM FXCX A (NOLOCK) INNER JOIN FCXA B (NOLOCK) ON (B.CODCXA = A.CODCXA) INNER JOIN GCOLIGADA C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA) WHERE A.DATA BETWEEN '21/06/2016' AND '21/06/2016' AND A.CODCXA = '0105' AND A.TIPO IN (3, 7) GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC
Só que está dando os seguintes erros:
Msg 102, Level 15, State 1, Line 10 Incorrect syntax near '='. Msg 102, Level 15, State 1, Line 15 Incorrect syntax near 'Z'. Msg 102, Level 15, State 1, Line 17 Incorrect syntax near '.'. Msg 102, Level 15, State 1, Line 23 Incorrect syntax near ','.
Alguém poderia me ajudar? Como posso corrigir isso?
Grato,
Ilano
Respostas
-
Olá,
no primeiro Inner join, substituta a linha por esta:
INNER JOIN FCXA B (NOLOCK)
pois eu errei na digitação.
Abs.
Leandro de Agostini MCTS - Web Application, Framework 4
- Marcado como Resposta Robson William Silva quarta-feira, 31 de agosto de 2016 19:35
Todas as Respostas
-
Destrinchando sua query esse trecho não Compila, pelo simples motivo que a variável
NUM_CHEQUE precisa de um valor de atribuição , coisa que não esta sendo feito dentro do contexto dos parênteses,
para cada parêntese aberto ( select alguma coisa ) e delimitado um contexto de execução.
NUM_CHEQUE = CASE WHEN LTRIM(RTRIM(A.NUMERODOCUMENTO)) IS NULL THEN ( SELECT @SQLStr = @SQLStr + Z.TESTE + ' ' FROM ( (SELECT ', ', CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE FROM FBORDERO X WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA ) Z
Wesley Neves
- Editado Wesley Neves segunda-feira, 29 de agosto de 2016 17:59
-
ilanocf,
Acredito que o trecho destacado pelo Wesley representa uma parte do seu código que esta sendo utilizado dentro do seu sistema como elemento para recebimento de valores de entrada, ou seja, como se você um parâmetro onde a aplicação envia dados para o SQL Server.
Note que a variável ou parâmetnro @SQLStr esta sendo concatenada com ela mesma e outra coluna, em qual parte do seu código esta variável esta sendo processada?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Olá,
veja se o erro foi corrigido.
DECLARE @SQLStr VARCHAR(5000) SET @SQLStr = '' SELECT UPPER(A.NOMINAL), CASE WHEN LTRIM(RTRIM(A.NUMERODOCUMENTO)) IS NULL THEN (SELECT @SQLStr + Z.TESTE + ' ' FROM(SELECT ', ', CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE FROM FBORDERO AS X, FCXA AS B WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA) AS Z) ELSE LTRIM(RTRIM(UPPER(A.NUMERODOCUMENTO))) END AS NUM_CHEQUE, SUM(A.VALOR), (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO) AS TIPO, UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO) AS CONTA_CAIXA, CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END AS ENDERECO, UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP AS CIDADE, CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END AS FONE, 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br' AS EMAIL, C.CGC AS CNPJ FROM FXCX AS A (NOLOCK) INNER JOIN FCXA AA B (NOLOCK) ON (B.CODCXA = A.CODCXA) INNER JOIN GCOLIGADA AS C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA) WHERE A.DATA BETWEEN '21/06/2016' AND '21/06/2016' AND A.CODCXA = '0105' AND A.TIPO IN (3, 7) GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC
Abs.
Leandro de Agostini MCTS - Web Application, Framework 4
-
-
Olá,
no primeiro Inner join, substituta a linha por esta:
INNER JOIN FCXA B (NOLOCK)
pois eu errei na digitação.
Abs.
Leandro de Agostini MCTS - Web Application, Framework 4
- Marcado como Resposta Robson William Silva quarta-feira, 31 de agosto de 2016 19:35
-
Complementando a resposta do
1)criei as estruturas em tabelas temporárias do que seu select pede
2) transcrevi sua query renomeando para as tabelas temporárias
3)perceba que surge o erro
--
Msg 8155, Level 16, State 2, Line 91
No column name was specified for column 1 of 'Z'.Motivado pelo trecho
SELECT ', ' ,CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
perceba que se vc selecionar o trecho abaixo e executar vai ver que o result set são duas colunas e não apenas uma
SELECT ', ' ,CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
FROM #FBORDERO AS X ,
#FCXA AS B
WHERE X.CODCOLIGADA = B.CODCOLIGADA
AND X.CODCXA = B.CODCXAsegue q query completa
DECLARE @SQLStr VARCHAR(5000);
SET @SQLStr = '';
IF ( OBJECT_ID('TEMPDB..#FBORDERO') IS NOT NULL )
DROP TABLE #FBORDERO;
CREATE TABLE #FBORDERO -- Chamado de X
(
IDBORDERO VARCHAR(MAX) ,
CODCOLIGADA INT ,
CODCXA INT,
);
IF ( OBJECT_ID('TEMPDB..#FCXA') IS NOT NULL ) -- chamado de B
DROP TABLE #FCXA;
CREATE TABLE #FCXA
(
CODCOLIGADA INT ,
CODCXA INT ,
DESCRICAO VARCHAR(MAX)
);
IF ( OBJECT_ID('TEMPDB..#V_TIPOEXTRATOCAIXA') IS NOT NULL )
DROP TABLE #V_TIPOEXTRATOCAIXA;
CREATE TABLE #V_TIPOEXTRATOCAIXA
(
NOME VARCHAR(MAX) ,
CODIGO INT,
);
IF ( OBJECT_ID('TEMPDB..#FXCX') IS NOT NULL )
DROP TABLE #FXCX;
CREATE TABLE #FXCX
(
NUMERODOCUMENTO VARCHAR(MAX) ,
NOMINAL VARCHAR(MAX) ,
VALOR DECIMAL(18, 2) ,
TIPO INT ,
CODCXA VARCHAR(MAX) ,
CODCOLIGADA VARCHAR(MAX) ,
DATA DATE
);
IF ( OBJECT_ID('TEMPDB..#GCOLIGADA') IS NOT NULL )
DROP TABLE #GCOLIGADA;
CREATE TABLE #GCOLIGADA
(
CODCOLIGADA VARCHAR(MAX) ,
DESCRICAO VARCHAR(MAX) ,
RUA VARCHAR(MAX) ,
BAIRRO VARCHAR(MAX) ,
NUMERO VARCHAR(MAX) ,
CEP VARCHAR(MAX) ,
CIDADE VARCHAR(MAX) ,
ESTADO VARCHAR(MAX) ,
FAX VARCHAR(MAX) ,
TELEFONE VARCHAR(MAX) ,
EMAIL VARCHAR(MAX) ,
CGC VARCHAR(MAX)
);
SELECT UPPER(A.NOMINAL) ,
CASE WHEN LTRIM(RTRIM(A.NUMERODOCUMENTO)) IS NULL
THEN ( SELECT @SQLStr + Z.TESTE + ' '
FROM ( SELECT ', ' ,CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
FROM #FBORDERO AS X ,
#FCXA AS B
WHERE X.CODCOLIGADA = B.CODCOLIGADA
AND X.CODCXA = B.CODCXA
) AS Z
)
ELSE LTRIM(RTRIM(UPPER(A.NUMERODOCUMENTO)))
END AS NUM_CHEQUE ,
SUM(A.VALOR) ,
( SELECT UPPER(X.NOME)
FROM #V_TIPOEXTRATOCAIXA X ( NOLOCK )
WHERE X.CODIGO = A.TIPO
) AS TIPO ,
UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO) AS CONTA_CAIXA ,
CASE WHEN C.BAIRRO IS NOT NULL
THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: '
+ UPPER(C.BAIRRO)
ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO)
END AS ENDERECO ,
UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP AS CIDADE ,
CASE WHEN C.FAX IS NOT NULL
THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX
ELSE 'FONE: ' + C.TELEFONE
END AS FONE ,
'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br' AS EMAIL ,
C.CGC AS CNPJ
FROM #FXCX AS A ( NOLOCK )
INNER JOIN #FCXA B ( NOLOCK ) ON ( B.CODCXA = A.CODCXA )
INNER JOIN #GCOLIGADA AS C ( NOLOCK ) ON ( C.CODCOLIGADA = A.CODCOLIGADA )
WHERE A.DATA BETWEEN '21/06/2016' AND '21/06/2016'
AND A.CODCXA = '0105'
AND A.TIPO IN ( 3, 7 )
GROUP BY A.NOMINAL ,
A.NUMERODOCUMENTO ,
A.VALOR ,
A.TIPO ,
A.CODCXA ,
B.CODCOLIGADA ,
B.CODCXA ,
B.DESCRICAO ,
C.RUA ,
C.BAIRRO ,
C.NUMERO ,
C.CEP ,
C.CIDADE ,
C.ESTADO ,
C.FAX ,
C.TELEFONE ,
C.EMAIL ,
C.CGC;Wesley Neves
-
Ainda completando a resposta temos o seguinte
Esse trecho so complia se o campo DATA for varchar(N) ,se for datetime ,precisa dos casts ou convert A.DATA BETWEEN '21/06/2016' AND '21/06/2016'
DATA VARCHAR(MAX)
a query abaixo foi compilada no sql server 2012
trocando o trecho
SELECT ', ',CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
por SELECT ', '+CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
segue a query compilada
DECLARE @SQLStr VARCHAR(5000);
SET @SQLStr = '';
IF ( OBJECT_ID('TEMPDB..#FBORDERO') IS NOT NULL )
DROP TABLE #FBORDERO;
CREATE TABLE #FBORDERO -- Chamado de X
(
IDBORDERO VARCHAR(MAX) ,
CODCOLIGADA INT ,
CODCXA INT,
);
IF ( OBJECT_ID('TEMPDB..#FCXA') IS NOT NULL ) -- chamado de B
DROP TABLE #FCXA;
CREATE TABLE #FCXA
(
CODCOLIGADA INT ,
CODCXA INT ,
DESCRICAO VARCHAR(MAX)
);
IF ( OBJECT_ID('TEMPDB..#V_TIPOEXTRATOCAIXA') IS NOT NULL )
DROP TABLE #V_TIPOEXTRATOCAIXA;
CREATE TABLE #V_TIPOEXTRATOCAIXA
(
NOME VARCHAR(MAX) ,
CODIGO INT,
);
IF ( OBJECT_ID('TEMPDB..#FXCX') IS NOT NULL )
DROP TABLE #FXCX;
CREATE TABLE #FXCX
(
NUMERODOCUMENTO VARCHAR(MAX) ,
NOMINAL VARCHAR(MAX) ,
VALOR DECIMAL(18, 2) ,
TIPO INT ,
CODCXA VARCHAR(MAX) ,
CODCOLIGADA VARCHAR(MAX) ,
DATA VARCHAR(MAX)
);
IF ( OBJECT_ID('TEMPDB..#GCOLIGADA') IS NOT NULL )
DROP TABLE #GCOLIGADA;
CREATE TABLE #GCOLIGADA
(
CODCOLIGADA VARCHAR(MAX) ,
DESCRICAO VARCHAR(MAX) ,
RUA VARCHAR(MAX) ,
BAIRRO VARCHAR(MAX) ,
NUMERO VARCHAR(MAX) ,
CEP VARCHAR(MAX) ,
CIDADE VARCHAR(MAX) ,
ESTADO VARCHAR(MAX) ,
FAX VARCHAR(MAX) ,
TELEFONE VARCHAR(MAX) ,
EMAIL VARCHAR(MAX) ,
CGC VARCHAR(MAX)
);
SELECT UPPER(A.NOMINAL) ,
CASE WHEN LTRIM(RTRIM(A.NUMERODOCUMENTO)) IS NULL
THEN ( SELECT @SQLStr + Z.TESTE + ' '
FROM ( SELECT ', '+CAST(X.IDBORDERO AS VARCHAR(15)) AS TESTE
FROM #FBORDERO AS X ,
#FCXA AS B
WHERE X.CODCOLIGADA = B.CODCOLIGADA
AND X.CODCXA = B.CODCXA
) AS Z
)
ELSE LTRIM(RTRIM(UPPER(A.NUMERODOCUMENTO)))
END AS NUM_CHEQUE ,
SUM(A.VALOR) ,
( SELECT UPPER(X.NOME)
FROM #V_TIPOEXTRATOCAIXA X ( NOLOCK )
WHERE X.CODIGO = A.TIPO
) AS TIPO ,
UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO) AS CONTA_CAIXA ,
CASE WHEN C.BAIRRO IS NOT NULL
THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: '
+ UPPER(C.BAIRRO)
ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO)
END AS ENDERECO ,
UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP AS CIDADE ,
CASE WHEN C.FAX IS NOT NULL
THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX
ELSE 'FONE: ' + C.TELEFONE
END AS FONE ,
'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br' AS EMAIL ,
C.CGC AS CNPJ
FROM #FXCX AS A ( NOLOCK )
INNER JOIN #FCXA B ( NOLOCK ) ON ( B.CODCXA = A.CODCXA )
INNER JOIN #GCOLIGADA AS C ( NOLOCK ) ON ( C.CODCOLIGADA = A.CODCOLIGADA )
WHERE A.DATA BETWEEN '21/06/2016' AND '21/06/2016'
AND A.CODCXA = '0105'
AND A.TIPO IN ( 3, 7 )
GROUP BY A.NOMINAL ,
A.NUMERODOCUMENTO ,
A.VALOR ,
A.TIPO ,
A.CODCXA ,
B.CODCOLIGADA ,
B.CODCXA ,
B.DESCRICAO ,
C.RUA ,
C.BAIRRO ,
C.NUMERO ,
C.CEP ,
C.CIDADE ,
C.ESTADO ,
C.FAX ,
C.TELEFONE ,
C.EMAIL ,
C.CGC;
Wesley Neves
- Editado Wesley Neves quarta-feira, 31 de agosto de 2016 14:40 Erro
- Sugerido como Resposta Wesley Neves quarta-feira, 31 de agosto de 2016 14:42
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 1 de setembro de 2016 15:11
-
-
ilanocf,
Então, como esta definido os relacionamentos? As condições aplicados nos joins estão corretas?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]