# پایگاه‌های داده > SQL Server > T-SQL >  انجام کارهای Delete , Insert, Update با Store Procedure

## pishraft

سلام
خوبین؟
میشه با Store Procedure کارهایی مثل Insert , delete, Update رو انجام داد؟
یعنی تو یه Store Procedure تعریف کنم و تو برنامم اون Store Procedure رو صدا کنم؟
مرسی

----------


## Reza_Yarahmadi

اصولي ترين روش اجراي (تقريبا) هر نوع دستور SQLي ، نوشتن اون بصورت يك SP  و صدا زدن اون از طرف برنامه است.

----------


## ehsanara

مشکت چیه برا نوشتن Store procedure

----------


## pishraft

من دوستورات رو مینویسم ولی کار نمیکنه!
پیغام  SuccessFull میده ولی کار نمیکنه

----------


## Reza_Yarahmadi

روند كلي كار رو ميگم:
يك SP با ساختار كلي زير بنويسيد و بعد از انتخاب ديتابيس مورد نظر از منوي SQL Server ، روي دكمه Executeكليك كنيد.
Create Proc ProcName
--Declare Params
AS
--Sql Commands
بعد از زدن دكمه Execute در صورتيكه مشكلي نداشته باشه SP بصورت كامل ذخيره ميشه.
كارهاي سمت SQL Server تموم شد و براي اجراي اين SP سمت برنامه كافيه به جاي CommandText نام SP ايجاد شده رو بنويسيد‌ و CommandType رو از نوع StoredProcedure قرار بديد، در صورت داشتن پارامتر ورودي پارامتر ها رو بهش معرفي و مقدار دهي كنيد. در صورتي هم كه بخوايد اين SP رو سمت SQL Server اجرا كنيد (براي تست و يا استفاده از اين SP‌ در SPهاي ديگه) بصورت زير اين كار رو انجام بديد
Exec SPName 'Value1', Value2, ...

----------


## pishraft

مرسی
مناین کارها رو انجام دادم

USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[N]    Script Date: 02/26/2011 14:18:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[N]
As
BEGIN
DELETE
FROM TestTbl
END


مشکل من اینه که کار نمیکنه
مثلا تو کد بالا جدول رو خالی نمیکنه

----------


## Reza_Yarahmadi

يعني چي كار نميكنه؟ در صورتيكه اين SP توي ديتابيس ذخيره شده كد زير رو اجرا كنيد ببينيد كار ميكنه يا نه.
USE [Test]
Exec [dbo].[N]
در صورت امكان نحوه اجراي اين SP رو هم توضيح و كدهاي مربوطه رو اينجا بذاريد.

----------


## farzinf

سلام دوستان ميشه براي دستورات Insert , delete, Update يه نمونه SP استاندارد بزاريد ؟ 
اگه ميشه براي ايجاد USER‌در SQL هم يه نمونه بزاريد خيلي ممنون 

با تشكر

----------


## saeed.samiee

يك sp در  پيوست موجود است .

من تقريبا براي همه تيبل هايم از همين روش استفاده ميكنم . 

قسمت هاي غير فعال شده براي ذخيره اطلاعات قبلي ركورد در تيبل ديگري است تا امكان رديابي تغييرات باشد كه فعلا بكار شما نمي آيد . 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[SpASTAssistsUpdate] 
 @Mode            as  tinyint,
 @SerialNo 	as int,
 @FirstName as varchar(50),
 @LastName 	as varchar(50),
 @SurName 	as varchar(50),
 @Address 	as varchar(100),
 @Region    as tinyint,
 @TelHome   as varchar(50),
 @TelWork   as varchar(50),
 @TelMobile as varchar(50),
 @TelFax    as varchar(50),
 @Email     as varchar(100),
 @WebSite   as varchar(100),
 @JobRel    as varchar(100)='',
 @Desc      as varchar (100),
 @UserCode 	as char(10)

 AS
declare @SerialNoTMP  int
--declare  @UserCodeOld     char(10)
--declare  @UserNameOld    varchar(50)
--declare  @UserName         varchar(50)
begin

--set @UserCodeOld  =  ( select         UserCodeAST     from ASTAssists        where 	SerialNoAST	 = @SerialNo)
--set @UserNameOld =  ( select         NamePUC           from PUBUserCodes where     CodePUC            = @UserCodeOld )
--set @UserName =  ( select         NamePUC           from PUBUserCodes where            CodePUC = @UserCode )
/*
set @FirstName = dbo.FixPersianString(@FirstName)
set @LastName = dbo.FixPersianString(@LastName)
set @SurName = dbo.FixPersianString(@SurName)
set @Address = dbo.FixPersianString(@Address)
set @SurName = dbo.FixPersianString(@SurName)
set @JobRel = dbo.FixPersianString(@JobRel)
set @Desc = dbo.FixPersianString(@Desc)
*/
if @Mode = 1    begin
     INSERT INTO ASTAssists 
	 ( 
	 FirstNameAST,
	 LastNameAST,
	 SurNameAST,
	 AddressAST,
     RegionAST,
	 TelHomeAST,
	 TelWorkAST,
	 TelMobileAST,
	 TelFaxAST,
	 EmailAST,
     WebSiteAST,
     JobRelAST,
	 DescAST,
	 UserCodeAST,
	 TimeStamsAST
	 ) 
     VALUES 
	( 
	 @FirstName,
	 @LastName,
	 @SurName,
	 @Address,
     @Region,
	 @TelHome,
	 @TelWork,
	 @TelMobile,
	 @TelFax,
	 @Email,
     @WebSite,
     @JobRel,
	 @Desc,
	 @UserCode,
	 getdate()
	 )
   set @SerialNoTMP = @SerialNo
end   else  if @Mode = 2    begin
/*
     INSERT INTO ASTAssistsBak
	 ( SerialNoAstBAST,
	 FirstNameBAST,
	 LastNameBAST,
	 SurNameBAST,
	 AddressBAST,
     RegionBAST,
	 TelBAST,
	 DescBAST,
     UserNameOldBAST,
     TimeStamsOldBAST ,
     StatusBAST,
     UserNameBAST,
     TimeStamsBAST ) 
    ( select 
     SerialNoAST,
	 FirstNameAST,
	 LastNameAST,
	 SurNameAST,
	 AddressAST,
     RegionAST,
	 TelHomeAST,
	 DescAST ,
     @UserNameOld,
     TimeStamsAST,
     @Mode,
     @UserName    ,
     getdate()
    from ASTAssists where 	SerialNoAST	 = @SerialNo)
*/
    UPDATE ASTAssists   SET  
	 FirstNameAST	= @FirstName,
	 LastNameAST	= @LastName,
	 SurNameAST		= @SurName,
	 AddressAST		= @Address,
	 RegionAST      =  @Region,
	 TelHomeAST		= @TelHome,
	 TelWorkAST		= @TelWork,
	 TelMobileAST	= @TelMobile,
	 TelFaxAST		= @TelFax,
	 EmailAST		= @Email,
     WebSiteAST     =@WebSite,
     JobRelAST      =@JobRel, 
	 DescAST		= @Desc,
	 UserCodeAST	= @UserCode,
	 TimeStamsAST	= getdate()
   WHERE 
	SerialNoAST	 = @SerialNo
    set @SerialNoTMP = @SerialNo
end   else  if @Mode = 3   begin
begin TRANSACTION    
/*
     INSERT INTO ASTAssistsBak
	 ( SerialNoAstBAST,
	 FirstNameBAST,
	 LastNameBAST,
	 SurNameBAST,
	 AddressBAST,
	 RegionBAST,
	 TelBAST,
	 DescBAST,
     UserNameOldBAST,
     TimeStamsOldBAST ,
     StatusBAST,
     UserNameBAST,
     TimeStamsBAST ) 
    ( select 
     SerialNoAST,
	 FirstNameAST,
	 LastNameAST,
	 SurNameAST,
	 AddressAST,
     RegionAST,
	 TelHomeAST,
	 DescAST ,
     @UserNameOld,
     TimeStamsAST,
     @Mode,
     @UserName    ,
     getdate()
     from  ASTAssists WHERE 	SerialNoAST = @SerialNo)
*/
   DELETE ASTAssists WHERE 	SerialNoAST = @SerialNo
   if @@error = 0  begin
        COMMIT 
   end begin   
        ROLLBACK  
   end
set @SerialNoTMP  = (select top 1 SerialNoAST from ASTAssists where SerialNoAST < @SerialNo order by SerialNoAST desc)
end
return @SerialNoTMP 
end;

----------


## farzinf

خيلي ممنون از راهنمايي تون اگه ميشه توضيح بدين در موردش و اين كد چي رو بر مي گردونه 
return @SerialNoTMP 

دوست عزيز حالا ميشه توضيح بدين كه چطور اين sp ها را فراخاني كنم با مقدار

----------


## ircast

با سلام

نمونه SP ساده رو گذاشتم امیدوارم کمکتون کنه

Insert:

CREATE PROCEDURE Insert_Student
@Scode NVARCHAR(15)
,@SFName NVARCHAR(50)
,@SLName NVARCHAR(50)
,@SPName NVARCHAR(50)
,@Snationalcode NVARCHAR(15)
,@ID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Student
(SCode, SFName, SLName, SPName, Snationalcode)
VALUES (@Scode, @SFName, @SLName, @SPName,@Snationalcode)
SET @ID=scope_identity()
 
END

Update:
CREATE PROCEDURE Update_Student
@Scode NVARCHAR(15)
,@SFName NVARCHAR(50)
,@SLName NVARCHAR(50)
,@SPName NVARCHAR(50)
,@Snationalcode NVARCHAR(15)
,@ID INT 
AS
BEGIN
SET NOCOUNT ON;
UPDATE Student SET
SCode=@Scode
,SFName =@SFName
,SLName =@SLName
,SPName =@SPName
,Snationalcode =@Snationalcode
 
WHERE Id=@ID
 
END

Delete:

CREATE PROCEDURE Delete_Student
 @ID INT 
AS
BEGIN
 SET NOCOUNT ON;
 
DELETE FROM Student
 
 WHERE Id=@ID
   
END

----------


## saeed.samiee

سلام 
من فقط با دلفي كار ميكنم و ميتوانم كمكت كنم .
مقدار بازگشتي شماره سريال ركورد اضافه شده را برميگرداند . در من در برنامه هايم  پس از اضافه كردن ركورد به يك تيبل همان ركورد را در حالت انتخاب شده در يك گريد نشان ميدهم تا كاربر به كارش مطمئن شود . در ضمن خط شماره 80 بايد به اين صورت اصلاح شود 
set @SerialNoTMP =@@identity
سعيد سميعي

----------


## فانوس1

سلام 
من این دستور را در C#‎ نوشتم اجرا هم میشه dataGradeview هم اونا نشون میده.
اما مشکل من اینه که فقط تو dataGradeview هست و هیچی تو اصل پایگاه داده ذخیره نمیشه. :گریه:

----------


## حسین.کاظمی

با سلام این یک نمونه برنامه ساخت sp در sql server و فراخوانی sp  در سی شارپ 
عملیات درج،ویرایش،حذف

لینک دانلود>>Test_StoredProcedure.rar

اگر کارتو راه انداخت ممنون میشم از دکمه تشکر استفاده کنی

موفق باشی

----------

