none
Como selecionar um campo de uma tabela retornada por stored procedure? RRS feed

  • Pergunta

  • Bom dia

        A situação é a seguinte, tenho uma stored procedure (chamarei de spTab) que retorna uma tabela e preciso dos valores de alguns campos dessa tabela numa segunda SP (aqui spCon) para atribuir valores e trabalhar com eles. Como eu poderia selecionar campos dessa primeira tabela gerada dentro da segunda SP?

        Tentei tabela temporária, alias à execução da primeira SP (como abaixo), etc... Segue o exemplo abaixo de uma das minhas tentativas mal sucedidas.

    ´   Agradeço a atenção.

    ----------------------------------------------

    Código da primeira SP:
    CREATE PROCEDURE spTab @param1, @param2, @param3
    AS
    ...
    SELECT campo1, campo2, campo 3, campo4
    FROM tbTabela
    GO

    ----------------------------------------------

    Código da segunda SP:
    CREATE PROCEDURE spCon
    AS
    ...
    SELECT @var = T.campo1
    FROM (EXEC spTab 'Valor1', 'Valor2', 'Valor3') T <= Aqui está o problema
    ...
    GO

    -------------------------------------------

    segunda-feira, 8 de janeiro de 2007 18:39

Respostas

  •     Antes de tudo, desculpe o tempo de retorno à vocês, estávamos num período de transferência de local de trabalho e com um outro sistema em situação de urgência.

     Anderson.dpa wrote:

    Atribua os valores dos campos a variáveis de saída, seria uma alternativa.

     

     

    Espero ter ajudado

     Junior Galvão... wrote:

    Andre,

    Você poderia criar os seus parâmetros na Stored Procedure, como se fossem parâmetros de saída, armazenar e utilizar estes valores na sua outra procedure.

    CREATE PROCEDURE spTab @param1 Output, @param2 Output, @param3 Output
    AS

    Mas concordo com o Marcelo, ficaria mais fácil de trabalhar você criar um Function que retorne como valor uma table, baseando-se nos valores fornecidos em seus parâmetros na stored procedure.

    Para Anderson.dpa e Junior Galvão...

        Acrescentar um parâmetro de saída não seria uma alternativa, no caso em que esta situação está envolvida, seria a solução. O problema é que a primeira Stored Procedure é acessada por um sistema de 6 anos em produção e uma das prioridades do meu serviço. Eu não poderia alterar essa SP sem adaptar também o sistema em produção. Ou seja, iria causar reflexos que não seriam viáveis neste momento.

     Marcelo Colla - MVP wrote:

    troque a primeira proc por uma funcao que rotorne um table

     

     Create Table Exemplo (campo1  int,campo2 int,campo3 int)


     Create Function Ufn_RetExemplo ()
     Returns Table
     as
       return (Select  Campo1, Campo2, Campo3 From Exemplo)


     Create Proc Usp_Teste
     As
     
       Select * From dbo.Ufn_RetExemplo ()

     
     exec Usp_Teste

     

    Abs;

    Para Marcello Cola - MVP e Junior Galvão...

        Eu tentei criar uma função 'Returns Table' que executasse a primeira SP e depois, na segunda SP acessar a função, mas não funcionou. Os códigos ficaram mais ou menos assim:
    ----------------------------------------------
    Código da primeira SP:
    CREATE PROCEDURE spTab @param1, @param2, @param3
    AS
    ...
    SELECT campo1, campo2, campo 3, campo4
    FROM tbTabela
    GO
    ----------------------------------------------
    Código da função: (tentei também as outras variações da função CREATE FUNCTION)
    CREATE FUNCTION fnFuncao(@param1, @param2, @param3)
    RETURNS TABLE

    AS

    RETURN (EXEC spTab @param1, @param2, @param3)
    GO
    ----------------------------------------------
    Código da segunda SP alterada: (acessando agora a função acima)
    CREATE PROCEDURE spCon
    AS
    ...
    SELECT @var = T.campo1
    FROM fnFuncao('Valor1', 'Valor2', 'Valor3') T <= Mesmo assim retorna um erro aqui.
    ...
    GO
    -------------------------------------------

        Então um amigo sugeriu criar uma tabela temporária e jogar o resultado da primeira SP dentro dessa tabela e trabalhar nela, não necessitando de uma função, como o exemplo acima. Não ficou muito legal mas funciona. Para exemplificar a solução:

    -------------------------------------------
    Manter a primeira SP (não seria viável alterá-la no momento pelos reflexos que causaria)
    CREATE PROCEDURE spTab @param1, @param2, @param3
    AS
    ...
    SELECT campo1, campo2, campo 3, campo4
    FROM tbTabela
    GO
    -------------------------------------------
    Código da segunda SP alterada:
    CREATE PROCEDURE spCon
    AS
    ...
    CREATE TABLE #tbTemp (campo1 int, campo2 int, campo3 int, campo4 int)
    INSERT INTO #tbTemp
    EXEC spTab 'Valor1', 'Valor2', 'Valor3'
    SELECT @var = campo1
    FROM #tbTemp
    ...
    GO
    ------------------------------------------

        Então vou usando a solução acima.

        Depois de testar as sugestões dadas por vocês aqui, e algumas variações, ficou claro que não há muito o que fazer enquanto eu tiver que trabalhar assim. O ideal seria copiar todo o código da primeira SP para uma função e citar esta função na segunda SP, já que o retorno da spTab (primeira SP) é uma tabela. Ou também copiar o código da primeira SP para uma outra, acrescentando parâmetros OUTPUT e reescrever algumas partes, já que o retorno da spTab (primeira SP), apesar de ser uma tabela, tem um registro somente.

     

        Agradeço a atenção de vocês.

    terça-feira, 6 de fevereiro de 2007 01:15

Todas as Respostas

  • Atribua os valores dos campos a variáveis de saída, seria uma alternativa.

     

     

    Espero ter ajudado

    segunda-feira, 8 de janeiro de 2007 19:04
  • troque a primeira proc por uma funcao que rotorne um table

     

     Create Table Exemplo (campo1  int,campo2 int,campo3 int)


     Create Function Ufn_RetExemplo ()
     Returns Table
     as
       return (Select  Campo1, Campo2, Campo3 From Exemplo)


     Create Proc Usp_Teste
     As
     
       Select * From dbo.Ufn_RetExemplo ()

     
     exec Usp_Teste

     

    Abs;

    terça-feira, 9 de janeiro de 2007 09:06
  • Andre,

    Você poderia criar os seus parâmetros na Stored Procedure, como se fossem parâmetros de saída, armazenar e utilizar estes valores na sua outra procedure.

    CREATE PROCEDURE spTab @param1 Output, @param2 Output, @param3 Output
    AS

    Mas concordo com o Marcelo, ficaria mais fácil de trabalhar você criar um Function que retorne como valor uma table, baseando-se nos valores fornecidos em seus parâmetros na stored procedure.

    terça-feira, 9 de janeiro de 2007 10:12
  •     Antes de tudo, desculpe o tempo de retorno à vocês, estávamos num período de transferência de local de trabalho e com um outro sistema em situação de urgência.

     Anderson.dpa wrote:

    Atribua os valores dos campos a variáveis de saída, seria uma alternativa.

     

     

    Espero ter ajudado

     Junior Galvão... wrote:

    Andre,

    Você poderia criar os seus parâmetros na Stored Procedure, como se fossem parâmetros de saída, armazenar e utilizar estes valores na sua outra procedure.

    CREATE PROCEDURE spTab @param1 Output, @param2 Output, @param3 Output
    AS

    Mas concordo com o Marcelo, ficaria mais fácil de trabalhar você criar um Function que retorne como valor uma table, baseando-se nos valores fornecidos em seus parâmetros na stored procedure.

    Para Anderson.dpa e Junior Galvão...

        Acrescentar um parâmetro de saída não seria uma alternativa, no caso em que esta situação está envolvida, seria a solução. O problema é que a primeira Stored Procedure é acessada por um sistema de 6 anos em produção e uma das prioridades do meu serviço. Eu não poderia alterar essa SP sem adaptar também o sistema em produção. Ou seja, iria causar reflexos que não seriam viáveis neste momento.

     Marcelo Colla - MVP wrote:

    troque a primeira proc por uma funcao que rotorne um table

     

     Create Table Exemplo (campo1  int,campo2 int,campo3 int)


     Create Function Ufn_RetExemplo ()
     Returns Table
     as
       return (Select  Campo1, Campo2, Campo3 From Exemplo)


     Create Proc Usp_Teste
     As
     
       Select * From dbo.Ufn_RetExemplo ()

     
     exec Usp_Teste

     

    Abs;

    Para Marcello Cola - MVP e Junior Galvão...

        Eu tentei criar uma função 'Returns Table' que executasse a primeira SP e depois, na segunda SP acessar a função, mas não funcionou. Os códigos ficaram mais ou menos assim:
    ----------------------------------------------
    Código da primeira SP:
    CREATE PROCEDURE spTab @param1, @param2, @param3
    AS
    ...
    SELECT campo1, campo2, campo 3, campo4
    FROM tbTabela
    GO
    ----------------------------------------------
    Código da função: (tentei também as outras variações da função CREATE FUNCTION)
    CREATE FUNCTION fnFuncao(@param1, @param2, @param3)
    RETURNS TABLE

    AS

    RETURN (EXEC spTab @param1, @param2, @param3)
    GO
    ----------------------------------------------
    Código da segunda SP alterada: (acessando agora a função acima)
    CREATE PROCEDURE spCon
    AS
    ...
    SELECT @var = T.campo1
    FROM fnFuncao('Valor1', 'Valor2', 'Valor3') T <= Mesmo assim retorna um erro aqui.
    ...
    GO
    -------------------------------------------

        Então um amigo sugeriu criar uma tabela temporária e jogar o resultado da primeira SP dentro dessa tabela e trabalhar nela, não necessitando de uma função, como o exemplo acima. Não ficou muito legal mas funciona. Para exemplificar a solução:

    -------------------------------------------
    Manter a primeira SP (não seria viável alterá-la no momento pelos reflexos que causaria)
    CREATE PROCEDURE spTab @param1, @param2, @param3
    AS
    ...
    SELECT campo1, campo2, campo 3, campo4
    FROM tbTabela
    GO
    -------------------------------------------
    Código da segunda SP alterada:
    CREATE PROCEDURE spCon
    AS
    ...
    CREATE TABLE #tbTemp (campo1 int, campo2 int, campo3 int, campo4 int)
    INSERT INTO #tbTemp
    EXEC spTab 'Valor1', 'Valor2', 'Valor3'
    SELECT @var = campo1
    FROM #tbTemp
    ...
    GO
    ------------------------------------------

        Então vou usando a solução acima.

        Depois de testar as sugestões dadas por vocês aqui, e algumas variações, ficou claro que não há muito o que fazer enquanto eu tiver que trabalhar assim. O ideal seria copiar todo o código da primeira SP para uma função e citar esta função na segunda SP, já que o retorno da spTab (primeira SP) é uma tabela. Ou também copiar o código da primeira SP para uma outra, acrescentando parâmetros OUTPUT e reescrever algumas partes, já que o retorno da spTab (primeira SP), apesar de ser uma tabela, tem um registro somente.

     

        Agradeço a atenção de vocês.

    terça-feira, 6 de fevereiro de 2007 01:15