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 / 153738
Accepted
Edgar Allan Bayron
Edgar Allan Bayron
Asked: 2016-10-31 14:26:08 +0800 CST2016-10-31 14:26:08 +0800 CST 2016-10-31 14:26:08 +0800 CST

Procedimento armazenado SQL com parâmetro de saída

  • 772

Eu sei como escrever um procedimento armazenado com parâmetros de saída. Mas eu não sei a razão pela qual eu usaria isso apenas usando uma SELECTdeclaração simples. Um procedimento armazenado normal ainda pode retornar uma saída em uma grade (veja os exemplos abaixo).

Alguém pode dar um exemplo da vida real onde eu possa usar um SP com parâmetro de saída com SP sem parâmetro de saída?

Exemplos

-- Using output parameter
SELECT @var = COUNT(*) FROM table1 WHERE gender = @gender...

-- Without output parameter
SELECT COUNT(*) FROM table WHERE gender = @gender...
sql-server t-sql
  • 3 3 respostas
  • 28723 Views

3 respostas

  • Voted
  1. Best Answer
    Randolph West
    2016-10-31T19:55:40+08:002016-10-31T19:55:40+08:00

    Parâmetros de saída em procedimentos armazenados são úteis para passar um valor de volta para o T-SQL chamador, que pode usar esse valor para outras coisas.

    Digamos que você tenha um procedimento armazenado que retorna um estado dado a entrada de uma cidade, com estado como parâmetro de saída:

    CREATE PROCEDURE [dbo].[GetStateFromCity] (@City NVARCHAR(30), @State NCHAR(2) OUTPUT)
    AS
    SELECT @State = [State]
    FROM [ExampleTable] 
    WHERE [City] = @City
    GO;
    

    Agora você pode usar este parâmetro de saída para passar um valor em outro lugar.

    Por exemplo:

    DECLARE @State int
    EXEC [dbo].[GetStateFromCity] @City = 'Calgary', @State OUTPUT;
    
    -- Do something with this value
    SELECT @State;
    
    -- Do something else
    EXEC [dbo].[GetInsuranceCompanyByState] @State;
    

    Para resumir, se você quiser apenas retornar um valor para um aplicativo cliente, provavelmente não precisará de um parâmetro de saída.

    No entanto, se você deseja passar valores em T-SQL entre procedimentos armazenados, eles podem ser muito úteis.

    Para o que vale a pena, eu quase não uso parâmetros de saída.

    • 4
  2. Solomon Rutzky
    2016-10-31T21:10:52+08:002016-10-31T21:10:52+08:00

    Supondo que essa pergunta se refira ao SQL Server: tudo se resume ao contexto e à eficiência.

    Contexto = Código do aplicativo

    Ao executar o procedimento armazenado a partir do código do aplicativo, não é muito diferente em termos de quantidade de código. Ao retornar um conjunto de resultados, basta chamar ExecuteReadere, SqlDataReader.Read()em seguida, obter uma linha e, em seguida, obter as colunas do arquivo SqlDataReader. Mas se você estiver obtendo apenas um único valor, poderá usar o método de atalho ExecuteScalarque obtém uma linha (mesmo que haja mais linhas) e retorna o valor na primeira coluna (mesmo que haja mais colunas). Ao retornar OUTPUTparâmetros, você só precisa chamar ExecuteNonQuery, verificar a .Valuepropriedade de cada parâmetro e converter para o tipo apropriado.

    Portanto, em termos do exemplo simples de retornar um único valor, parece "mais fácil" retornar um conjunto de resultados e chamar ExecuteScalar. MAS, retornar um conjunto de resultados, seja usando ExecuteReaderou ExecuteScalar, requer mais recursos do SQL Server e do aplicativo cliente. O SQL Server precisa configurar e gerenciar o conjunto de resultados (ou seja, requer memória e tempo), e o aplicativo precisa instanciar um SqlDataReader(sim, mesmo usando ExecuteScalar) e gerenciá-lo (ou seja, requer memória e tempo). Se você tiver a garantia de ter apenas uma única linha de conjunto de resultados, é melhor (mesmo que apenas um pouco) usando parâmetros de saída.

    Contexto = T-SQL

    Ao executar o procedimento armazenado do T-SQL (e precisar usar o(s) valor(es) retornado(s), é pelo menos mais conveniente usar OUTPUTparâmetros. Retornar um conjunto de resultados é utilizável, mas requer a inserção dos resultados em uma tabela -- normalmente uma tabela temporária local ou variável de tabela -- usando INSERT ... EXEC. Mas você ainda precisa selecionar a linha em variáveis ​​locais. Novamente, é mais tempo e recursos para chegar ao mesmo lugar de ter os valores nas variáveis.

    Agora, quando você está retornando apenas um único valor (ou seja, a mesma situação que funciona para ), às vezesExecuteScalar você pode usar uma Função Definida pelo Usuário (UDF) escalar, que tem a capacidade de ser colocada em uma consulta, que às vezes é muito útil (mesmo se houver um impacto no desempenho do uso de UDFs escalares em consultas). No entanto, existem muitas restrições sobre o que pode ser feito em UDFs, portanto, se você precisar criar tabelas temporárias ou fazer qualquer DML ou DDL, etc., usar um procedimento armazenado é a única opção.


    Embora não faça parte da pergunta "conjunto de resultados vs parâmetro OUTPUT", é bom ter em mente que você pode fazer as duas coisas! Se você tiver alguns valores discretos, bem como um conjunto de dados para retornar, o procedimento armazenado permite retornar ambos, o que em raras ocasiões é bastante útil.

    • 4
  3. Daniel Bragg
    2019-02-01T07:42:28+08:002019-02-01T07:42:28+08:00

    Duas outras coisas que acho que valem a pena destacar:

    1) Você pode passar mais de um parâmetro como OUTPUT,

    2) Você não precisa chamar os parâmetros com OUTPUTse não quiser os resultados

    CREATE PROCEDURE ManyOutputs @a int, @b int output, @c varchar(100) output, @d bit output
    AS
    BEGIN
        SET @b = @a + 11
        SET @c = 'The Value of A is ' + CAST(@a AS varchar(5)) + ', and the value of B is ' + CAST(@b AS varchar(5))
        IF (@a % 2 = 1)
            SET @d = 1
        ELSE
            SET @d = 0
    END
    GO
    

    Chamando esta rotina:

    DECLARE @bVal int
    DECLARE @cVal varchar(100)
    DECLARE @dVal bit
    
    EXEC ManyOutputs 1, @bVal, @cVal, @dVal
    SELECT @bVal AS bVal, @cVal as cVal, @dVal as dVal
    

    Retorna NULO, NULO, NULO

    EXEC ManyOutputs 2, @bVal OUT, @cVal OUT, @dVal OUT
    SELECT @bVal AS bVal, @cVal as cVal, @dVal as dVal
    

    Retorna 13, "O valor de A é 2 e o valor de B é 13", 0

    EXEC ManyOutputs 3, @bVal, @cVal, @dVal
    SELECT @bVal AS bVal, @cVal as cVal, @dVal as dVal
    

    Retorna 13, "O valor de A é 2 e o valor de B é 13", 0

    (o mesmo que a última chamada, porque não obtivemos novos valores usando OUTPUT, portanto, manteve os valores antigos.)

    EXEC ManyOutputs 5, @bVal OUT, @cVal OUT, @dVal OUT
    SELECT @bVal AS bVal, @cVal as cVal, @dVal as dVal
    

    Retorna 16, "O valor de A é 5 e o valor de B é 16", 1

    • 3

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