Usuário com melhor resposta
Select que chama Function que chama Stored Procedure

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
Respostas
-
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
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
-
-
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 -
-
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
-
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
-