AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 253924
Accepted
GWR
GWR
Asked: 2019-11-23 05:22:37 +0800 CST2019-11-23 05:22:37 +0800 CST 2019-11-23 05:22:37 +0800 CST

Somente retorne o(s) conjunto(s) de registros do Stored Procedure se ele tiver linhas

  • 772

Eu tenho um procedimento armazenado que retorna vários conjuntos de registros para uso em um aplicativo. Às vezes, alguns desses conjuntos de registros estão vazios.

Eu gostaria de reduzir a sobrecarga e retornar apenas aqueles que têm 1 ou mais linhas.

Minha pergunta é - Como posso retornar apenas os conjuntos de registros que possuem linhas?

O aplicativo simplesmente espera 0 ou mais conjuntos de registros, faz um loop em cada um e os imprime.

Eu sei que posso ignorá-los no código do aplicativo, mas estou tentando impedir que eles sejam retornados, se estiverem vazios.

O procedimento é tão simples quanto isto:

CREATE PROCEDURE bfsp_PROC_NM
AS 

    BEGIN

        SELECT * FROM TABLE_1

        SELECT * FROM TABLE_2

        SELECT * FROM TABLE_3

        RETURN  

    END
GO

No procedimento real, algumas das consultas são caras, então eu não quero ter que testar a consulta, então se ela retornar uma linha ou mais, execute-a novamente... pois seria muito caro.

sql-server t-sql
  • 3 3 respostas
  • 2690 Views

3 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2019-11-23T07:04:25+08:002019-11-23T07:04:25+08:00

    Eu tenho um procedimento armazenado que retorna vários conjuntos de registros para uso em um aplicativo. Às vezes, alguns desses conjuntos de registros estão vazios.

    Eu gostaria de reduzir a sobrecarga e retornar apenas aqueles que têm 1 ou mais linhas.

    Essa é uma ideia terrível. Como o aplicativo saberá qual conjunto de resultados está processando? Os procedimentos armazenados devem ter um conjunto fixo de formas de conjunto de resultados.

    Dito isto, para fazer isso, carregue os resultados em tabelas temporárias e, em seguida, SELECT daquelas se não estiverem vazias.

    por exemplo

    CREATE PROCEDURE bfsp_PROC_NM
    AS 
    
        BEGIN
            SELECT * 
            into #result1
            FROM TABLE_1
            if @@rowcount > 0
              select * from #result1
    
            SELECT * 
            into #result2
            FROM TABLE_2
            if @@rowcount > 0
              select * from #result2
    
            SELECT * 
            into #result3
            FROM TABLE_3
            if @@rowcount > 0
              select * from #result3
    
        END
    GO
    
    • 5
  2. Yannick Liekens
    2019-11-23T05:43:22+08:002019-11-23T05:43:22+08:00

    Eu gosto que meu código seja previsível, se você sempre retorna X conjuntos de dados, você pode programar isso em seu aplicativo e sempre sabe o que esperar. Então talvez não seja a melhor ideia filtrar conjuntos.

    No entanto, uma opção pode ser verificar se a tabela/seleção que você está executando retorna linhas, se retornar o conjunto, caso contrário, você o ignora. Isso obviamente tem um pouco de sobrecarga, pois você precisa especificá-lo para cada conjunto de resultados que está retornando.

    Exemplo como visto neste código:

    CREATE TABLE dbo.ReturnSet1( Id INT IDENTITY,NickName VARCHAR(256) )
    CREATE TABLE dbo.ReturnSet2 (Id INT IDENTITY,NickName VARCHAR(256) )
    
    INSERT INTO ReturnSet1
    VALUES('TestRecord')
    
    GO
    CREATE PROCEDURE dbo.TestReturnSet
    AS
    BEGIN
    
        IF EXISTS ( SELECT 1 FROM dbo.ReturnSet1 )
        BEGIN
            SELECT NickName
             FROM dbo.ReturnSet1
        END
    
        IF EXISTS ( SELECT 1 FROM dbo.ReturnSet2 )
        BEGIN
            SELECT NickName
             FROM dbo.ReturnSet2
        END
    
    
    END
    GO
    
    EXEC dbo.TestReturnSet
    
    DROP TABLE dbo.ReturnSet1
    DROP TABLE dbo.ReturnSet2
    DROP PROCEDURE dbo.TestReturnSet
    
    • 4
  3. Sam
    2019-11-26T09:01:16+08:002019-11-26T09:01:16+08:00

    Supondo que os dados de todas as três tabelas tenham estrutura semelhante, você pode inserir os dados em uma única tabela temporária e, em seguida, fazer com que seu procedimento retorne um conjunto de resultados com todas as linhas disponíveis:

    create procedure one_result_set
    
        # create temp table to hold all result rows
        create temporary table temp_one {
            table_name char(50),  # this field indicates source table
            field1 type1,
            ...
            fieldN typeN
        }
    
        # insert rows from first table into temp table 
        insert into temp_one
        select 'table1', t.* from table1 t;
    
        # insert rows from second table into temp table 
        insert into temp_one
        select 'table2', t.* from table2 t;
    
        # insert rows from third table into temp table 
        insert into temp_one
        select 'table3', t.* from table3 t;
    
        # finally, return all the fetched rows as a single result set
        select * from temp_one;
    
    end procedure$$
    

    O conjunto de resultados retornado ainda pode estar vazio - se nenhuma das três tabelas de origem tiver dados para retornar - mas você pode determinar isso a partir dos metadados.

    Se as tabelas de origem não compartilharem uma estrutura semelhante, tenho que concordar com as respostas anteriores - retornar um número variável de conjuntos de resultados é uma má ideia. Se as tabelas de origem forem diferentes e seu procedimento retornar menos de três conjuntos de resultados, você precisará verificar a lista de campos para cada conjunto de resultados apenas para descobrir o que estava faltando antes de processar os dados.

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve