Nome de usuário (campos userlgi e userlga) através de consulta SQL

Sei que é possível extrair o código do usuário dos campos lgi e lga em uma consulta sql, no entanto, gostaria de saber se é possível obter o nome do usuário?

Segue um exemplo que eu utilizo:

SELECT TOP 10 SUBSTRING(F2USERLGI, 3, 1)+SUBSTRING(F2_USERLGI, 7, 1)+ SUBSTRING(F2_USERLGI, 11,1)+SUBSTRING(F2_USERLGI, 15,1)+ SUBSTRING(F2_USERLGI, 2, 1)+SUBSTRING(F2_USERLGI, 6, 1)+ SUBSTRING(F2_USERLGI, 10,1)+SUBSTRING(F2_USERLGI, 14,1)+ SUBSTRING(F2_USERLGI, 1, 1)+SUBSTRING(F2_USERLGI, 5, 1)+ SUBSTRING(F2_USERLGI, 9, 1)+SUBSTRING(F2_USERLGI, 13,1)+ SUBSTRING(F2_USERLGI, 17,1)+SUBSTRING(F2_USERLGI, 4, 1)+ SUBSTRING(F2_USERLGI, 8, 1) Usuario_CRIAÇÃO FROM SF2010 ORDER BY R_E_C_N_O DESC

Para a data, podemos usar: SELECT TOP 10 CONVERT(VARCHAR, DATEADD(DAY, ((ASCII(SUBSTRING(F2USERLGA,12,1)) - 50) * 100 + (ASCII(SUBSTRING(F2_USERLGA,16,1)) - 50)), '19960101'), 112) FROM SF2010 ORDER BY R_E_C_N_O DESC

Obrigado Leandro. A sua query realmente retorna o código do usuário, mas eu precisava do nome. É um relatório em excel que estou usando, a query está no arquivo mesmo, eu gostaria de exibir o nome do usuário. Mas valeu pela ajuda mesmo assim.

Se você estiver já com o dicionário no banco acredito que seja possível fazer uma join SYS_USR. Caso contrário, somente utilizando a função em AdvPL. Paliativamente eu criaria uma tabela customizada no banco e criaria uma função para exportar os dados dos usuários nela (aliás, é o que eu faço hoje).

Boa sugestão, mas meu dicionário ainda está nos arquivos. Vlw mesmo assim.

No SQL não é possível.

Há algumas funções do advpl que podem resolver o problema.

Aconselho usar o FWSFALLUSERS().

[https://tdn.totvs.com/display/public/PROT/FWSFALLUSERS][1]

Com base na resposta do Leandro Michelsen eu construí o script abaixo que trás os dados do usuário vinculando o XX_USERLGI e XX_USERLGA ao cadastro de usuários (USR).

Usei como exemplo a tabela SB1 no Microsoft SQL Server e adicionei um CASE que verifica se houve alteração no registro, trazendo assim o B1_USERLGA e não o B1_USERLGI:


SELECT
    -- Campos do cadastro de usuário
    USR.USR_ID,
    USR.USR_CODIGO,
    USR.USR_NOME
FROM
    SB1990 SB1 -- Tabela de produtos
    INNER JOIN
        SYS_USR USR -- Tabela de usuários (dicionário no banco)
        ON
            CASE
                -- Verifica se houve alteração (B1_USERLGA com a 11ª posição preenchida)
                -- Caso sim, use B1_USERLGA, caso não, usa B1_USERLGI
                WHEN (SUBSTRING(SB1.B1_USERLGA, 11, 1) != ' ') THEN 
                    SUBSTRING(SB1.B1_USERLGA, 11, 01) + SUBSTRING(SB1.B1_USERLGA, 15, 01) + SUBSTRING(SB1.B1_USERLGA, 02, 01) +
                    SUBSTRING(SB1.B1_USERLGA, 06, 01) + SUBSTRING(SB1.B1_USERLGA, 10, 01) + SUBSTRING(SB1.B1_USERLGA, 14, 01)
                ELSE 
                    SUBSTRING(SB1.B1_USERLGI, 11, 01) + SUBSTRING(SB1.B1_USERLGI, 15, 01) + SUBSTRING(SB1.B1_USERLGI, 02, 01) +
                    SUBSTRING(SB1.B1_USERLGI, 06, 01) + SUBSTRING(SB1.B1_USERLGI, 10, 01) + SUBSTRING(SB1.B1_USERLGI, 14, 01)
            END = USR.USR_ID
WHERE
    SB1.D_E_L_E_T_ = ' '

Obs: Caso precisem converter a query acima para outro SGBD, recomendo este site aqui: https://www.sqlines.com/online