Jump to content

Stored Procedure Update


skcratch
 Share

Recommended Posts

Viva!

Pretendo criar uma stored procedure que me permita realizar o update dos campos de uma tabela que já foram previamente inseridos na base de dados. No entanto, a minha intenção é criar uma stored procedure que permita não só actualizar todos os campos mas também algum em particular, que seja passado como parâmetro na stored procedure.

Numa primeira abordagem, pensei em inicializar todas as variáveis de entrada da stored procedure correspondentes aos campos da tabela a NULL e verificar posteriormente o seu valor. Os parâmetros que se mantivessem a NULL na invocação da stored procedure, significava que não iria ser realizada qualquer actualização no campo correspondente da tabela.

Na vossa opinião, existe alguma forma mais eficaz de realizar aquilo que pretendo?

Grato desde já pela ajuda,

Cumps!

😉

Link to comment
Share on other sites

Viva!

O código que tenho é o seguinte:

create procedure spAlterarAtleta
@nomeProcura nvarchar(100),
@nome nvarchar(100) = null,
@dataNascimento datetime = null,
@sexo nvarchar(10) = null,
@numBI varchar(10) = null
as
begin transaction

declare @idAtleta int

set @idAtleta = (select idatleta from atleta where nome = @nomeProcura)
if(@@error <> 0)
	goto erro

if(@idAtleta is null)
	goto erroAtletaNaoExiste

update atleta 
set
	nome = @nome
where idAtleta = @idAtleta
if(@@error <> 0)
	goto erro

commit transaction
return 0

erroAtletaNaoExiste:
print 'O atleta não existe na base de dados!'
erro:
print 'Ocorreu um erro!'

rollback transaction
return 1
go

exec spAlterarAtleta 'Filipe Henriques', 'Rui Gonçalves'

Tal como referi no post anterior, aquilo que pretendo é actualizar apenas alguns campos. Como podem ver, o nome que pretendo alterar é passado como parâmetro na stored procedure realizando a respectiva actualização. No entanto, desejo que a stored procedure seja "inteligente", isto é, que realize apenas a actualização na tabela dos parâmetros que são passados na sua invocação, sem ter que recorrer a um if para verificar se todos parâmetros passados, são ou não nulos.

Cumps!

😉

Link to comment
Share on other sites

Acho que estás a complicar desnecessariamente.

CREATE procedure spAlterarAtleta
(	@nomeProcura	nvarchar(100)
,	@nome		nvarchar(100) = NULL
,	@dataNascimento	datetime = NULL
,	@sexo		nvarchar(10) = NULL
,	@numBI		varchar(10) = NULL
) AS

Update atleta
Set nome = IsNull(@nome, nome)
  , dataNascimento = IsNull(@dataNascimento, dataNascimento)
  , sexo = IsNull(@sexo, sexo)
  , numBI = IsNull(@numBI, numBI)
Where nome = @nomeProcura

Como não sabia o nome das colunas supus que o nome delas é similar ao nome da variável correspondente.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Viva!

Já percebi a tua ideia mas, ou estou a invocar mal a stored procedure, ou não é uma solução correcta.

Por exemplo, para alterar apenas o sexo (exemplo duvidoso...!!!) de um atleta, eu invoco da seguinte forma a stored procedure:

exec spAlterarAtleta 'Mario', '', '', 'feminino'

No entanto, vai haver alteração dos outros registos da tabela, ficando o nome em branco e a data de nascimento a 01-01-1900 00:00:00.

Estou a realizar mal a invocação da stored procedure?

Grato desde já pela ajuda,

Cumps!

😉

Link to comment
Share on other sites

Presumo que queiras fazer:

exec spAlterarAtleta 'Mario', null, null, 'feminino'

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.