Jump to content
FabianoSouza

Function para retornar JSON

Recommended Posts

Olá pessoal.

Eu já utilizo o FOR JSON PATH para retornar o o resultado de uma consulta com JSON. Isso eu já sei fazer.

 

O que preciso é criar uma função que receba um SELECT como parâmetro e retorne o resultado desse SELECT já formatado como JSON.

Estou tentando isso, mas sem sucesso.

 

A function dbo.fn_retornaJsonPath :

(@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN

BEGIN
IF @String <> NULL 
SET @String = (SELECT @String AS jsonPath FOR JSON PATH) 
END

BEGIN
IF @String IS NULL
SET @String = '[]' 
END

RETURN @String
END

Forma de executar:

SET @sql = 'SELECT '
SET @sql = @sql + ' dbo.fn_retornaJsonPath ((SELECT TT.tema FROM dbo.tabela AS TT WHERE TT.cd = CTT.id)) AS ''temas'' '
SET @sql = @sql + ' FROM dbo.minhaTab AS CTT '

EXEC(@sql)

Mas não está rolando....

Share this post


Link to post
Share on other sites
CREATE FUNCTION FormatJsonString(@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue SYSJSON;
        SET @JsonValue = CAST(@String AS SYSJSON);

        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

tente assim

Share this post


Link to post
Share on other sites

Olá @Marcos_imasters.

 

Tentei exaustivamente rodar o seu código...mas sem sucesso.

 

O SQL Server sequer reconhece "SYSJSON" para declarar a variável @JsonValue.

É alguma função de versão antiga do SQL Server? Estou usando a última versão do Management Studio e SQl Server 2022.

Share this post


Link to post
Share on other sites

sim ela é reconhecida até o 2019,tente assim 

 

CREATE FUNCTION FormatJsonString(@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue JSON;
        SET @JsonValue = CAST(@String AS JSON);

        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

 

Share this post


Link to post
Share on other sites

@Marcos_imasters...continua ocorrendo erro.

USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

Veja o erro:


Msg 102, Nível 15, Estado 1, Procedimento FormatJsonString, Linha 9 [Linha de Início do Lote 7]
Sintaxe incorreta próxima a '='.

 

Parece que há problema nessa linha 

RETURN FORMATJSON(@JsonValue, 'indent' = 4);

 

Share this post


Link to post
Share on other sites
Em 11/09/2023 at 17:02, FabianoSouza disse:

@Marcos_imasters...continua ocorrendo erro.


USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

Veja o erro:


Msg 102, Nível 15, Estado 1, Procedimento FormatJsonString, Linha 9 [Linha de Início do Lote 7]
Sintaxe incorreta próxima a '='.

 

Parece que há problema nessa linha 


RETURN FORMATJSON(@JsonValue, 'indent' = 4);

 

o correto nao seria 

RETURN FORMATJSON(@JsonValue, indent = 4);

 

Share this post


Link to post
Share on other sites
10 horas atrás, Marcos_imasters disse:

o correto nao seria 


RETURN FORMATJSON(@JsonValue, indent = 4);

 

Já testei sem as aspas, testei substituindo o = por vírgula... não executa.

Esse código roda aí no seu SQL?

Share this post


Link to post
Share on other sites

cara nao sei transact-sql só estou vendo com bases que eu vi que pode ser 

USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue NVARCHAR(MAX) AS JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

tenta assim

Share this post


Link to post
Share on other sites
7 horas atrás, Marcos_imasters disse:

cara nao sei transact-sql só estou vendo com bases que eu vi que pode ser 


USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue NVARCHAR(MAX) AS JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

tenta assim

@Marcos_imasters...continua ocorrendo erro.

USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

Veja o erro:


Msg 102, Nível 15, Estado 1, Procedimento FormatJsonString, Linha 9 [Linha de Início do Lote 7]
Sintaxe incorreta próxima a '='.

 

Parece que há problema nessa linha 

RETURN FORMATJSON(@JsonValue, 'indent' = 4);

 

7 horas atrás, Marcos_imasters disse:

cara nao sei transact-sql só estou vendo com bases que eu vi que pode ser 


USE [meu_banco]
GO
/****** Object:  UserDefinedFunction [dbo].[FormatJsonString]    Script Date: 11/09/2023 16:52:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[FormatJsonString](@String NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    IF @String IS NOT NULL
    BEGIN
        DECLARE @JsonValue NVARCHAR(MAX) AS JSON;
        SET @JsonValue = CAST(@String AS JSON);
        RETURN FORMATJSON(@JsonValue, 'indent' = 4);
    END
    ELSE
    BEGIN
        RETURN '[]';
    END
END;

tenta assim

Não vai de jeito nenhum... já tentei várias combinações.

Mas de todo modo, agradeço :-)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By clovis.sardinha
      Estou em um impasse pois sei pouco de javascript. Estou fazendo um autocomplete com CI4 e Javascript.
      Consigo gerar, através do controllers/model do CI4 um arquivo em json, mas não consigo retorná-lo para o javascript para poder mostrar as opções para consulta. 
      O console.log mostra que estou obtendo o  json() { [native code] }.
      Segue os dois arquivos para ver se alguém me ajuda.
      //arquivo cidade.js async function carregar_cidade(valor) { if (valor.length >= 3) { //console.log("Pesquisar:" + valor); const dados = fetch('Testes/?cidade='+valor, { method: "get", headers: { "Content-Type": "application/json", "X-Requested-With": "XMLHttpRequest" } }); const resposta = (await dados).json; console.log(resposta); var html = "<ul class='list-group position-fixed'>"; html += "<li class='list-group-item'>" + resposta['cid_nome'] + "</li>"; html += "</ul>"; } } <?php //arquivo Testes.php namespace App\Controllers; use App\Models\CidadeModel; /** NÃO MANDAR PARA O SERVIDOR - APENAS TESTES DE FUNÇÕES E OUTROS ELEMENTOS DO CI4 */ class Testes extends BaseController{ protected $tbCidades; public function __construct(){ $this->tbCidades = new CidadeModel(); } public function index(){ $request = \Config\Services::request(); $client = \Config\Services::curlrequest(); $cidades=[]; if($get=$request->getGet()){ $cities=$get['cidade']; $cidadeFiltrada=$this->tbCidades->getCidByName($cities); $cidades= json_encode($cidadeFiltrada); //dd($cidades); } echo view('Testes/testes'); } public function salvar(){ $request = \Config\Services::request(); if($post=$request->getPost()){ dd($post); } } } <!doctype html> <html lang="pt-br"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <title>Autocomplete</title> </head> <body> <div class="container"> <h1 class="mt-4 mb-4">Formulário</h1> <form class="row g-3"> <div class="col-12"> <label for="cidade" class="form-label">Cidade</label> <input type="text" name="cidade" class="form-control" id="cidade" placeholder="Pesquisar cidade" onkeyup="carregar_cidade(this.value)"> </div> <span ></span> </form> </div> <!-- Optional JavaScript; choose one of the two! --> <!-- Option 1: Bootstrap Bundle with Popper --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> <script src="assets/js/cidade.js"></script> </body> </html>
    • By PresleyMenezes
      Olá pessoal, gostaria de saber como copiar o conteúdo de um campo json com muitos pais e filhos e colar em outro campo de pais e filhos do mesmo arquivo json?
       
      agradeço a ajuda de vocês.
      em anexo o arquivo json e o codigo que estou tentando fazer

       

       

       
       
       
       

       

       
    • By Giovanird
      Olá a todos!
      Tenho uma api  Sala de Aula e dentro dela o id de cada aluno. Em outra api, API ALUNO,  tenho os dados de cada aluno:  nome, foto, endereço.
      Estou fazendo o foreach da api Sala de Aula e preciso também retornar os dados de cada aluno.
      Segue o código que não estou conseguindo desenvolver
      $sala = file_get_contents("https://api/sala?id=987"); $sala = json_decode($sala, true); $sala = $sala['data']; foreach ($sala as $resulsala){ $codigoaluno = $resulsala['idaluno']; $alunos = file_get_contents("https://api/alunos?id=$codigoaluno"); $alunos = json_decode($alunos, true); $alunos = $alunos['data']; foreach ($alunos as $resulalunos){ echo $resulalunos['nome']; echo $resulalunos['foto']; echo $resulalunos['rua']; } }  
    • By kania
      Tenho a seguinte situação.
      Recebo vários JSONs podendo ou não ser multidimensional, preciso atualizar uma determinada chave deste JSON, o problema é que algumas chaves podem ser duplicadas, bem como seus respectivos valores. Como estou tentando criar uma função genérica para navegar em qualquer JSON e modificar a chave em si, com estas duplicidades de chaves, estou tendo dificuldades em dizer ao código qual é chave que devo alterar.
       
      Arquivo JSON Exemplo
       
      {       "CREDITOR": {         "TAX": {           "TAC": 0.7         },         "ENABLE": "true",         "PRODUCTION": {           "email": "email@dominio.com",           "senha": "12457895",           "BASE_URL": "https://domino.com"         },         "HOMOLOGATION": {           "email": "email@dominio.com",           "senha": "12457895",           "BASE_URL": "https://domino.com"         },         "TARGET_VALUES": 5000000       }     }  
      Converto o JSON para array
       
      $json = json_decode($json_string, true);
      Função que criei até aqui
       
         
      /**      * Encontra a chave correspondente dentro do JSON      *      * @param array $jsonArray - JSON a ser verificado      * @param string $keyFather - chave de entrada      * @param string $keyUpdate - chave que modificar      * @param string $valueUpdate - novo valor da chave      * @return string      *      */     public static function searchKeyJson(array $jsonArray, string $keyFather, string $keyUpdate = null, $valueUpdate = null)     {         foreach ($jsonArray as $key => $value) {             if ($key == $keyFather && $keyUpdate == null) {                 $jsonArray[$key] =  $valueUpdate;                 return $jsonArray;             }             if ($key == $keyFather && $keyUpdate != null) {                 $jsonArray[$keyFather][$keyUpdate] = $valueUpdate;                 return $jsonArray;             }             if (is_array($value)) {                 if (($result = self::searchKeyJson($value, $keyFather, $keyUpdate, $valueUpdate)) !== false) {                     if ($keyUpdate == null) {                         return $result;                     } else {                         return $result;                     }                 }             }         }         return false;     }
      Até modifico o valor, mais no final para salvar, ele não monta o JSON como original, ele caba ignorando a chave inicial no JSON de exmeplo "CREDITOR": {}
       
      Retorno da função (notem que esta forma do padrão da original)
       
      => [          "TAX" => [            "TAC" => 0.7,          ],          "ENABLE" => "true",          "PRODUCTION" => [            "email" => "teste",            "senha" => "12457895",            "BASE_URL" => "https://domino.com",          ],          "HOMOLOGATION" => [            "email" => "email@dominio.com",            "senha" => "12457895",            "BASE_URL" => "https://domino.com",          ],          "TARGET_VALUES" => 5000000,        ]  
      Se eu percorrer o array e tentar modificar a chave em questão, ele muda todas as as chaves que tiverem no JSON porque tem duplicidade.
      Como posso resolver isto com uma função global que sirva para qualquer padrão de JSON que eu tiver?
    • By Jack Oliveira
      Ola pessoal estou com uma dificuldade ou melhor com erro ao fazer a leitura do arquivo por ajax
      Pelo meus calculos esta certo a forma que fiz, porem nao me mostra o resultado
      Espero que possam dar uma ideia do que seria e de como resolver
       
      este é o erro que retorna
      <br /> <b>Notice</b>: Undefined index: length in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>31</b><br /> <br /> <b>Notice</b>: Undefined index: start in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>32</b><br /> <br /> <b>Notice</b>: Undefined index: length in <b>C:\Host\htdocs\CMS-DELIVERY\CPANELUSER\ajax-list.php</b> on line <b>32</b><br /> You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1  
      No arquivo php esta assim
      <?php session_start(); header('Content-Type: application/json'); require('./database/config.php'); require('./database/config.database.php'); require_once('./includes/funcoes.php'); //require('ssp.class.php'); $Campos = "'DL.id, DL.titulo, DL.telefone, DC.titulo as CityTitulo'"; $column = array("DL.id", "DL.titulo", "DC.titulo", "DL.destaque"); $queryIJ = 'directory_listing DL inner join directory_cidades DC on(DL.cidade = DC.titulo)'; $query = "WHERE DC.status=1 AND DL.status=1 "; if (isset($_POST["is_category"])) { $query = "DL.cidade = '" . $_POST["is_category"] . "' AND "; } if (isset($_POST["search"]["value"])) { $query = '(DL.id LIKE "%' . $_POST["search"]["value"] . '%" OR DL.titulo LIKE "%' . $_POST["search"]["value"] . '%" OR DL.telefone LIKE "%' . $_POST["search"]["value"] . '%") '; } if (isset($_POST["order"])) { $query = 'ORDER BY ' . $column[$_POST['order']['0']['column']] . ' ' . $_POST['order']['0']['dir'] . ' '; } else { $query = 'ORDER BY DL.id DESC '; } $query1 = ''; if ($_POST["length"] != 1) { $query1 = 'LIMIT ' . $_POST["start"]. ', ' . $_POST["length"]; } define('QUERYIJ', $queryIJ); define('CAMPOS', $Campos); define('QUERY', $query); define('QUERY1', $query1); $number_filter_row = DBCount(QUERYIJ,CAMPOS,QUERY); function ListarDirectoryEmpresaCidade($Q1 = QUERYIJ, $Camp = CAMPOS, $Query2 = QUERY, $Query3 = QUERY1) { $QueryInnerJoin = DBRead($Q1,$Camp, $Query2 .$Query3); return groupByEmpresaByCidade($QueryInnerJoin,'CityTitulo'); } function groupByEmpresaByCidade($array, $key) { $return = array(); foreach($array as $val) { $return[$val[$key]][] = $val; } return $return; } $data = array(); $ListarDirectoryEmpresa = ListarDirectoryEmpresaCidade(); foreach ($ListarDirectoryEmpresa as $ListarCidade) { //$ListarCidade[0]['CityTitulo'] foreach ($ListarCidade as $ListarDirectory) { //$ListarDirectory['titulo'] $sub_array = array(); $sub_array[] = $ListarDirectory["id"]; $sub_array[] = $ListarDirectory["titulo"]; $sub_array[] = $ListarCidade[0]['CityTitulo']; $sub_array[] = $ListarDirectory["telefone"]; $data[] = $sub_array; } } $result = DBCount('directory_listing','*'); $output = array( "draw" => intval($_POST["draw"]), "recordsTotal" => $result, "recordsFiltered" => $number_filter_row, "data" => $data ); echo json_encode($output); ?> Ja no html esta assim
       
      <div class="table-responsive"> <table id="list_data" class="table table-bordered table-striped"> <thead> <tr> <th>Id.</th> <th>Titulo</th> <th> <select name="directory_cidades" id="directory_cidades" class="form-control"> <option value="">Buscar Cidade</option> <?php $Query = DBRead('directory_cidades','*',"ORDER BY titulo ASC"); foreach($Query as $rows) { echo '<option value="' . $rows["titulo"] . '">' . $rows["titulo"] . '</option>'; } ?> </select> </th> <th>Telefone</th> </tr> </thead> </table> </div> No javascript esta assim
       
      <script type="text/javascript" language="javascript"> $(document).ready(function() { load_data(); function load_data(is_category) { var dataTable = $('#list_data').DataTable({ "processing": true, "serverSide": true, "order": [], "ajax": { url: "ajax-list.php", type: "POST", data: { is_category: is_category } }, "columnDefs": [{ "targets": [2], "orderable": false, }, ], }); } $(document).on('change', '#directory_cidades', function() { var directory_cidades = $(this).val(); $('#list_data').DataTable().destroy(); if (directory_cidades != '') { load_data(directory_cidades); } else { load_data(); } }); }); </script> Sei que o problema não esta no html e nem no javacript postei eles para melhor entender
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.