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 / 97670
Accepted
WileCau
WileCau
Asked: 2015-04-13 18:29:38 +0800 CST2015-04-13 18:29:38 +0800 CST 2015-04-13 18:29:38 +0800 CST

Como obter o valor de retorno de um procedimento armazenado executado com sp_executesql

  • 772

Preciso chamar um procedimento armazenado em outro banco de dados e verificar o valor de retorno. O nome do outro banco de dados pode variar, então estou tentando usar sp_executesql, mas não consegui descobrir como obter o valor de retorno do procedimento.

Esta é uma versão simplificada do que eu tenho:

DECLARE @errorLogId INT
DECLARE @otherDbName NVARCHAR(MAX) = 'Foo' -- Get the database name from somewhere
DECLARE @sql NVARCHAR(MAX)

SET @sql = @otherDbName + '.dbo.SomeProc'

-- I want @errorLogId to be the return value from SomeProc, this didn't work.    
EXECUTE @errorLogId = sp_executesql @sql

IF @errorLogId <> 0
   RAISERROR('SomeProc failed, ErrorLogId = %d.', 16, 1, @errorLogId) WITH SETERROR

Se ocorrer um erro em SomeProc, ele for detectado e uma entrada for gravada em uma tabela de erros (no outro banco de dados), SomeProc retornará o ID da tabela de erros (identidade) do registro que foi gravado. Caso contrário, SomeProc retornará 0.

Eu sei que SomeProc está falhando porque um erro é gravado no log de erros no outro banco de dados, mas no banco de dados local @errorLogId é 0, que é tratado como sucesso. Eu pensei que o valor de retorno seria 'passado' sp_executesql, mas acho que o valor de retorno é realmente de sp_executesql não SomeProc (ou seja, sp_executesql pode ser bem-sucedido independentemente de SomeProc ter sucesso ou falhado).

Existe uma maneira de acessar o valor de retorno de @otherDbName.dbo.SomeProc no banco de dados local?

Obrigado

sql-server sql-server-2008-r2
  • 3 3 respostas
  • 28676 Views

3 respostas

  • Voted
  1. Best Answer
    cha
    2015-04-13T20:26:05+08:002015-04-13T20:26:05+08:00

    Você precisa usar o parâmetro OUTPUT, conforme descrito no artigo do MSDN :

    Dado este procedimento armazenado fictício:

    CREATE PROCEDURE sp_test AS
    RETURN 2
    

    Este código lhe dará o resultado:

    declare @ret int
    
    exec sp_executesql N'exec @ret = sp_test', N'@ret int OUTPUT', @ret = @ret OUTPUT 
    select @ret as result
    
    
    result
    -----------
    2
    
    (1 row(s) affected)
    
    • 5
  2. user202688
    2020-03-05T22:12:10+08:002020-03-05T22:12:10+08:00
    • Crie Proc com 2 parâmetros regulares e 1 parâmetro de tipo de valor de tabela e que retorne um int.
    • use sp_Executesql para permitir instruções de execução geradas dinamicamente.
    DROP PROC IF EXISTS tmp.EraseMeIfYouCan
    DROP TYPE IF EXISTS tmp.EraseMeTo
    GO
    
    CREATE TYPE tmp.EraseMeTo AS TABLE(Id INT)
    GO
    CREATE PROC tmp.EraseMeIfYouCan
        @Debug TINYINT ,                                -- 0 No debug, 1 debug + print, 2 = print only
        @P2 AS tmp.EraseMeTo READONLY,
        @DebugRetVal INT = 0                            
    AS
    SELECT *
    FROM   @P2
    
        RETURN @DebugRetVal
    GO
    SET NOCOUNT ON
    DECLARE @P INT = 1
    DECLARE @I INT = 0
    DECLARE @R INT
    DECLARE @EM2 AS tmp.EraseMeTo
    
    WHILE @I < 10
    BEGIN
        SET @I += 1
        INSERT INTO @EM2
          (
            Id
          )
        VALUES
          (
            @I
          )
    END
    PRINT 'Start sp-exec'
    EXEC SP_ExecuteSQL N'Exec @R = tmp.EraseMeIfYouCan @Debug, @P2, @DebugRetVal',
         N'@R Int Output, @P2 As tmp.EraseMeTo ReadOnly, @Debug TinyInt, @DebugRetVal Int',
         @R = @R OUTPUT,
         @P2 = @EM2,
         @Debug = 0,
         @DebugRetVal = 3
    
    SELECT @R
    
    • 0
  3. Milan Madubasha
    2019-02-06T07:20:03+08:002019-02-06T07:20:03+08:00

    Execute o procedimento (contendo os parâmetros de saída e entrada) e visualize os resultados

    IF spCHGAssetGet é o nome do procedimento armazenado.

    @CustomerID, @AssetID são os parâmetros de saída.

    @IDTicketItem, @IDExtWarranty são os parâmetros de entrada.

    DECLARE @CustomerID NVARCHAR(100) 
    DECLARE @AssetID    NVARCHAR(100) 
    EXEC spCHGAssetGet
    @IDTicketItem = 4764,
    @IDExtWarranty = NULL,
    @CustomerID = @CustomerID OUT,
    @AssetID = @AssetID OUT
    SELECT @CustomerID, @AssetID
    
    • -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