none
Onde está o erro desta consulta? RRS feed

  • 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

    segunda-feira, 29 de agosto de 2016 16:34

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

    quarta-feira, 31 de agosto de 2016 13:13

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
    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]

    terça-feira, 30 de agosto de 2016 15:57
  • 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

    terça-feira, 30 de agosto de 2016 16:49
  • Olá pessoal,

    Primeiro, gostaria de agradecer a todos pela atenção.

    Leandro, agora está aparecendo a seguinte linha de erro:

    Msg 102, Level 15, State 1, Line 33
    Incorrect syntax near 'B'.


    quarta-feira, 31 de agosto de 2016 11:50
  • 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

    quarta-feira, 31 de agosto de 2016 13:13
  • 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.CODCXA

    segue 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

    quarta-feira, 31 de agosto de 2016 14:31
  • 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
    quarta-feira, 31 de agosto de 2016 14:38
  • Deleted
    quarta-feira, 31 de agosto de 2016 14:39
  • Olá Wesley Neves,

    Não está retornando nenhum registro, mesmo removendo os parâmetros, trocando INNER JOIN por LEFT JOIN, RIGHT JOIN, FULL JOIN... não dá erro algum, mas também não retorna nenhuma informação.

    terça-feira, 8 de novembro de 2016 16:46
  • 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]

    quarta-feira, 9 de novembro de 2016 13:08