PDA

View Full Version : ایجاد یک stored procedure برای اضافه کردن رکورد



حسین محمدی
شنبه 05 خرداد 1386, 13:19 عصر
با سلام
من یک جدول در دیتابیس خود ساخته ام که به این شکل است:



create table human (
hId int identity(1,1) primary key ,
hName nvarchar(100) null ,
hLastName nvarchar(100) null ,
constraint u1 unique (hName, hLastName))


می خواهم یک stored procedure بنویسم که مقادیر hName و hLastName را به عنوان پارامتر بگیرد و چناچه مقادیر آن در جدول موجود نباشد آن را به جدول اضافه کند و مقدار identity آن رکورد را برگرداند و در صورتی که مقادیر آن از قبل در جدول موجود باشد فقط مقدار identity آن را برگرداند. و بهتر است مقدار Identity‌ در یک پارامتر سوم ریخته شود و برگردانده شود.

DonetKarvb
شنبه 05 خرداد 1386, 14:25 عصر
سلام

Create Proc SP_InsertHuman (
@ID Int Output,
@hName Nvarchar(100),
@hlastname nvarchar(100)
)
As
If (Select Count(*) From human
where hName=@hname and hLastname=@hLastname) >0
begin
Select @ID=hID From human
where hName=@hname and hLastname=@hLastname
return
end
Else
Insert Human Values(@hName,@hLastName)
Select @ID=Scope_Identity()

go

و اینم تست


Declare @ID int
Set @ID=0
Exec SP_InsertHuman @ID output, 'BarnameNevis','SQL Server'
Select @ID


تو برنامه یادت باشد که @ID را call by Refrence استفاده کنی

حسین محمدی
یک شنبه 06 خرداد 1386, 12:09 عصر
من یک مشکل دیگر دارم و آن اینکه گاهی کاربر مقادیر NULL را برای یکی از فیلد ها وارد می کند و در جستجوی رکورد مشکل ایجاد می شود:
مثلا اگر برای hName‌مقدار NULL و برای hLastName یک مقدار ('Hasani') را وارد کند در آن صورت


Where hName = @hName and hLastName = @hLastName

با مشکل مواجه می شود.

h_baqery
یک شنبه 06 خرداد 1386, 14:01 عصر
می تونید در بلاک if خالی بودن پارامترها رو چک کنید و در صورت لزوم پیغام بدهید.

AminSobati
دوشنبه 07 خرداد 1386, 13:36 عصر
create table t1(
c1 int identity(1,1),
c2 varchar(10),
c3 varchar(10),
unique (c2,c3))
go

create proc sp1
@p1 varchar(10),
@p2 varchar(10)
as
insert t1(c2,c3) values(@p1,@p2)
if @@error<>0 -- values already exist
begin
declare @id int
select @id=c1 from t1 where isnull(c2,'#NULL#')=isnull(@p1,'#NULL#') and isnull(c3,'#NULL#')=isnull(@p2,'#NULL#')
print @id
end
go

exec sp1 'a','b'
exec sp1 'a',null
exec sp1 null,null

در SQL Server 2005 به دلیل وجود دستور TRY...CATCH این کار به شکل بهتری در خصوص کنترل خطا انجام میشه. چیزی که براتون نوشتم در 2000 کاربرد داره