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 / 13782
Accepted
adopilot
adopilot
Asked: 2012-02-24 08:34:06 +0800 CST2012-02-24 08:34:06 +0800 CST 2012-02-24 08:34:06 +0800 CST

Parâmetro com valor de tabela como parâmetro de saída para procedimento armazenado

  • 772

É possível que o parâmetro Table-Valued seja usado como parâmetro de saída para o procedimento armazenado?

Aqui está, o que eu quero fazer no código

/*First I create MY type */
CREATE TYPE typ_test AS TABLE 
(
     id int not null
    ,name varchar(50) not null
    ,value varchar(50) not null
    PRIMARY KEY (id)
)
GO


--Now I want to create stored procedu whic is going to send output type I created, 
--But it looks like it is inpossible, at least in SQL2008
create  PROCEDURE [dbo].sp_test
         @od datetime 
        ,@do datetime 
        ,@poruka varchar(Max) output
        ,@iznos money output 
        ,@racun_stavke  dbo.typ_test   READONLY --Can I Change READONLY with OUTPUT ?
AS
BEGIN
    SET NOCOUNT ON;

    /*FILL MY OUTPUT PARAMS AS I LIKE */


    end
sql-server-2008 stored-procedures
  • 4 4 respostas
  • 77945 Views

4 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2012-02-24T10:02:19+08:002012-02-24T10:02:19+08:00

    Não, infelizmente os parâmetros de valor da tabela são somente leitura e somente entrada. Esse tópico em geral é muito bem abordado em Como Compartilhar Dados entre Stored Procedures , que apresenta todas as alternativas. Minha recomendação seria usar uma #tempmesa.

    • 43
  2. Andrew
    2017-08-23T12:48:15+08:002017-08-23T12:48:15+08:00

    Este é um post mais antigo, mas estava perto do topo quando eu estava procurando por "Parâmetro com valor de tabela como parâmetro de saída para procedimento armazenado". Embora seja do meu entendimento que você não pode passar um parâmetro com valor de tabela como um parâmetro de saída, imagino que o objetivo seja usar esse parâmetro de saída com valor de tabela como um parâmetro de entrada com valor de tabela em outro procedimento. Vou mostrar um exemplo de como eu fiz isso funcionar.

    Primeiro, crie alguns dados para trabalhar:

    create table tbl1
    (
    id int,
    fname varchar(10),
    gender varchar(10)
    );
    create table tbl2
    (
    id int,
    lname varchar(10)
    );
    insert into tbl1
    values
    (1,'bob'  ,'m'),
    (2,'tom'  ,'m'),
    (3,'sally','f')
    ;
    insert into tbl2
    values
    (1,'jones'   ),
    (2,'johnson' ),
    (3,'smith'   )
    ;
    

    Em seguida, crie um procedimento armazenado para capturar alguns dos dados. Normalmente, isso seria onde você está tentando criar um parâmetro de saída com valor de tabela.

    create procedure usp_OUTPUT1
     @gender varchar(10)
    as
    Begin
        select id from tbl1 where gender = @gender
    End
    

    Além disso, você desejará criar um tipo de dados (tipo de tabela) em que os dados do primeiro procedimento armazenado possam ser passados ​​como parâmetro de entrada para o próximo procedimento armazenado.

    create type tblType as Table (id int)
    

    Em seguida, crie o segundo procedimento armazenado que aceitará o parâmetro com valor de tabela.

    create procedure usp_OUTPUT2
    @tblType tblType readonly  --referencing the type created and specify readonly
    as
    begin
     select lname from tbl2 where id in (select id from @tblType)
    end
    

    Concedido, este não é um verdadeiro parâmetro de saída com valor de tabela, mas provavelmente produzirá resultados semelhantes ao que você estaria procurando. Declare seu parâmetro com valor de tabela, preencha-o com dados executando o procedimento armazenado nele e use-o como variável de entrada para o próximo procedimento.

    Declare @tblType tblType 
    insert into @tblType execute usp_OUTPUT1 'm'
    execute usp_OUTPUT2 @tblType
    
    • 2
  3. Marcello Miorelli
    2018-05-20T11:40:55+08:002018-05-20T11:40:55+08:00

    além da resposta bem colocada por remus, incluindo o link que ele forneceu

    Como compartilhar dados entre procedimentos armazenados

    há situações em que você obtém as seguintes mensagens de erro ao salvar os resultados de um procedimento armazenado em uma tabela:

    Uma instrução INSERT EXEC não pode ser aninhada.

    A transação atual não pode ser confirmada e não suporta operações que gravam no arquivo de log. Reverter a transação

    e quando isso acontece em meus próprios procedimentos armazenados que desenvolvo para meu próprio uso

    por exemplo, uma ferramenta para me informar de logintodos os grupos do AD aos quais pertence e todas as suas permissões em todos os bancos de dados em um servidor

    Eu crio uma tabela temporária fora do procedimento e passo o nome dela como parâmetro

    --===============
    -- this way below it works, by passing a temp table as a parameter
    --===============
    
                    if OBJECT_ID('tempdb.dbo.#my_table') IS NOT NULL
                       DROP TABLE #my_table
    
                    CREATE TABLE #my_table(
                        db nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                       permission_type nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                        login_  nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                        role_  nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                        Obj    nvarchar(517)   COLLATE Latin1_General_CI_AS  NULL,
                        Permission nvarchar(128)   COLLATE Latin1_General_CI_AS  NULL,
                        script nvarchar(1008)  COLLATE Latin1_General_CI_AS  NULL
                    ) 
    
                    exec sp_GetLoginDBPermissionsX 
                        @Login='my_loginname', 
                        @debug=0,
                        @where_to_save ='#my_table'
    
                    select *
                    from #my_table
    

    e dentro do procedimento, após todos os cálculos, quando estou retornando os dados finais (abaixo um exemplo) verifico se estamos saindo para uma tabela ou apenas voltando para a tela e crio o script dinamicamente.

                select @sql = case when @where_to_save IS not null then 
                '
                insert into ' + @where_to_save + '(db,Permission_Type,login_,role_,obj,Permission,script) '
                else '' end + 
    '
            SELECT 
                J.db,
                J.Permission_Type,
                J.login_,
                J.role_,
                J.Obj,
                J.Permission,
                J.script
            FROM #tablewithpermissions J
            WHERE J.login_ IN ( SELECT  L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
               OR J.role_ IN  ( SELECT  L1.LOGIN_FROM COLLATE Latin1_General_CI_AS FROM #logins L1)
           ORDER BY J.DB, J.[permission_order]
    '
            --print(@sql)
    
            EXEC(@SQL)
    

    Depois disso você tem as informações que você precisa na tela, ou se você passou uma tabela temporária como parâmetro, ela terá os dados agora.

    esta é uma solução que encontrei, mas só a uso para meus próprios trabalhos, DBAcaso contrário, isso será considerado de alto risco para Sql Injection .

    • 2
  4. Will
    2022-03-31T00:49:54+08:002022-03-31T00:49:54+08:00

    Uma tabela pode ser convertida em JSON (SQL Server 2016 ou posterior) e passada como um parâmetro nvarchar:

    CREATE PROCEDURE test
      @json nvarchar(max) output
    AS
    BEGIN
      SET NOCOUNT ON;
    
      --Create table variable
      declare @t1 as table ([value] nvarchar(max), [ordinal] int);
    
      --Fill table
      INSERT INTO @t1 ([value], [ordinal])
      SELECT 'abc', 1 UNION
      SELECT 'def', 2;
    
      --Convert table to JSON
      set @json  = (SELECT * FROM @t1 FOR JSON PATH);
    END
    

    [{"valor":"abc","ordinal":1},{"valor":"def","ordinal":2}]

    Em seguida, para convertê-lo novamente em uma tabela, especifique os nomes das colunas como chaves JSON:

    declare @json nvarchar(max);
    
    exec test @json output;
    
    --Convert JSON to table
    SELECT * FROM OPENJSON(@json)
    WITH ([value] nvarchar(max) '$.value', [ordinal] int '$.ordinal');
    
    • 0

relate perguntas

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

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

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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