Tempo aproximado para leitura: 00:03:00 min
Ocorrência
Ao utilizar a declaração de banco "MAX" para trabalhar com grandes tipos de dados, é retornado erro nas funções de execução de comandos SQL (Structured Query Language) na linguagem ADVPL (Advanced Protheus Language).
Ambiente
Cross Segmento - TOTVS Backoffice (Linha Protheus) – ADVPL – A partir da versão 11.8
Causa
O problema acontece devido ao driver SQL Server Native Client, que retorna o tamanho da coluna NVARCHAR(MAX) retornar o valor de tamanho como 0.
Solução
Caso seja utilizado o driver SQL Server, o DbAccess irá identificar esse tipo como campo Memo e retirar essa coluna do retorno, conforme documentado no TDN em DbAccess - Perguntas frequentes.
Para resolver essa situação, deve-se alterar a declaração MAX para um valor numérico (2000, por exemplo), pois dessa forma o DbAccess irá identificar como campo caractere e retornar o valor corretamente.
Exemplo
// BIBLIOTECAS NECESSÁRIAS
#Include "TOTVS.ch"
#Include "TOPCONN.ch"
#Include "TBICONN.ch"
// FUNÇÃO PRINCIPAL (PARA TESTE)
User Function TTCQUERY()
Local cQuery := ""
RPCSetEnv("99", "01") // REMOVER SE EXECUTADO VIA SMARTCLIENT
// cQuery += "SELECT CONVERT(VARCHAR(MAX), " // REMOVER E TROCAR POR NÚMERO
cQuery += "SELECT CONVERT(VARCHAR(2000), "
cQuery += "(SELECT TOP 1 C6_MOPC FROM SC6990 "
cQuery += "WHERE C6_NUM = 'PDV024')) AS BINARY_TO_VARCHAR"
TCQUERY cQuery NEW ALIAS QRY
RPCClearEnv() // REMOVER SE EXECUTADO VIA SMARTCLIENT
Return (NIL)
Para campos com valores extensos é necessário verificar as configurações das chaves MaxStringSize e MemoMega para que possa efetuar a leitura desses campos. Verificar os limites das chaves em suas documentações.
Saiba mais
Microsoft docs - Using large value types
0 Comentários