none
Select que chama Function que chama Stored Procedure RRS feed

  • Pergunta

  • Olá
    Estou trabalhando com dois bancos na mesma instância do SQL. No banco1, preciso fazer um SELECT de um campo numa determinada tabela. Se este campo estiver preenchido, preciso chamar uma função q já insira um registro novo numa outra tabela do Banco2 e me retorne esse novo código. Ficaria + - assim:

    USE Banco1
    SELECT CASE WHEN Tab.Campo1 IS NOT NULL THEN dbo.CadastraBanco2
      ELSE Tab.Campo1

    Código da função dbo.CadastraBanco2:

    USES Banco1
    CREATE FUNCTION dbo.CadastraBanco2
    RETURNS INT
    AS
    BEGIN
    SET @Codigo=[Banco2].[dbo].[sp_InsereBanco2]('Banco2')
    RETURN @Codigo
    END

    Código da stored procedure sp_InsereBanco2:
    USES Banco2
    CREATE PROCEDURE dbo.sp_InsereBanco2
    (@Banco VARCHAR)
    AS
    BEGIN
    DECLARE @Sql VARCHAR(MAX),
            @Codigo INT
    SET @Codigo=(SELECT MAX(Codigo) FROM Tabela2)+1

    SET @Sql='INSERT INTO ['+@Banco+'].[dbo].[Tabela2](Codigo, Nome) VALUES (MAX(Codigo),"BABLA")'
    EXEC sp_executeSQL @Sql
    RETURN @Codigo
    END

    No entanto, ao executar o SELECT no Banco1, o SQL dá o erro: "Cannot find either column "dbo" or the user-defined function or aggregate " "Banco2", or the name is ambiguous. (+ - isso)
    Esse erro vem da função CadastraBanco2 (já testei, quando comento tudo funciona). Mas eu criei a stored procedure porque a function não deixa eu executar o insert dentro dela.
    Mas eu preciso dessa função q insere um novo registro na tabela do Banco2 e me retorna isso no SELECT.
    Alguém sabe o que estou fazendo de errado, ou se isso for limitação do SQL, se eu conseguiria fazer de outro jeito?

    Grata,
    Viviane
    sexta-feira, 24 de abril de 2009 20:26

Respostas

Todas as Respostas

  • Caro,

     Não validei se o resto está correto, mas vi que vc tá chamando assim: SET @Codigo=[Banco2].[dbo].[sp_InsereBanco2]('Banco2'), eu faria duas modificações, colocaria uma variavel de retorno, e chamaria assim:

     EXEC Banco2.dbo.sp_inserebanco2 'Banco2', @codigo OUTPUT

    Abraços
    Gilberto neto
    Gilberto Neto Blog: http://gilberto-neto.spaces.live.com/default.aspx
    • Sugerido como Resposta Gilberto Neto sexta-feira, 24 de abril de 2009 21:42
    sexta-feira, 24 de abril de 2009 21:42
  • Olá Gilberto,

    Eu já tentei da forma que você mencionou, mas aí deu um erro informando que só podem ser executadas extended stored procedures de dentro da function.

    Grata,
    Viviane
    sábado, 25 de abril de 2009 01:23
  • Bom Dia,

    Não é possível executar stored procedures normais dentro de uma function (algumas extendidas também não são permitidas), pois, não é possível que uma function altere o estado do banco de dados, ou seja, ela não deve modificar nada que mude a situação do banco antes de ser executada. Se existe essa necessidade use uma stored procedure ao invés de uma function.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    segunda-feira, 27 de abril de 2009 12:17
  • Bom dia Gustavo,


    Então, o problema é que eu não consigo chamar uma stored procedure em um select, correto?
    Vou ter que pensar num outro jeito então.

    Grata,
    Viviane
    segunda-feira, 27 de abril de 2009 12:22
  • Olá Vivaine,

    Não diria o "problema" mas sim uma limitação.
    Não é possível chamar uma stored procedure dentro de um SELECT seja diretamente ou via Function. Eu sugiro o seguinte:

    - Construa uma SP
    - Coloque o SELECT dentro da SP
    - Após o SELECT chame a outra SP

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Piores Práticas - Uso do COUNT(*)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!538.entry
    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Vivaine segunda-feira, 27 de abril de 2009 12:49
    segunda-feira, 27 de abril de 2009 12:31
  • Olá Gustavo,

    Então, dessa forma que você sugeriu não vai me atender porque o que preciso é durante o select dar um insert numa outra tabela e já obter esse novo código numa coluna. Estou pensando em talvez trazer os próximos códigos no select mas sem ter inserido, salvar numa tabela temporária e usar o resultado do select pra inserir (pois as colunas que preciso estão lá).


    Grata,
    Viviane
    • Sugerido como Resposta César Habby sábado, 10 de julho de 2010 18:26
    segunda-feira, 27 de abril de 2009 12:49
  • Viviane estou com o mesmo problema, você consegui u solucionar??

     

    Att

     

    César

    sábado, 10 de julho de 2010 18:27