PDA

View Full Version : حل مشکل Stored Proceduer



Ring Eshgh
سه شنبه 13 دی 1390, 19:54 عصر
سلام

من این مشکلو تو Stored Proceduer دارم چه جوری حلش کنم.


CREATE PROCEDURE insertGuest
@FirstName nchar(10)
@LastName nchar(10)
@City nchar(10)
@Country nchar(10)
@Address ntext
@ZipCode numeric
@Phone numeric
@Passport numeric
@GuestID tinyint output
AS
BEGIN
insert into TBGuest
(FirstName,LastName,City,Country,Addres,ZipCode,Ph one,Passport)
values
(@FirstName,@LastName,@City,@Country,@Address,@Zip _Code,@Phone,@Passport)
set @GuestID=@@identity
END
GO


Erorr
Msg 102, Level 15, State 1, Procedure insertGuest, Line 4
Incorrect syntax near '@LastName'.
Msg 137, Level 15, State 2, Procedure insertGuest, Line 17
Must declare the scalar variable "@FirstName".
Msg 137, Level 15, State 1, Procedure insertGuest, Line 18
Must declare the scalar variable "@GuestID".


TB
Guest# -->nchar(10)
FirstName -->nchar(10)
LastName -->nchar(10)
City -->nchar(10)
Country -->nchar(10)
Address -->ntext
ZipCode -->numeric
Phone -->numeric
Passport -->numeric
GuestID -->tinyint output

یوسف زالی
سه شنبه 13 دی 1390, 21:09 عصر
سلام.
شما فراموش کردید که باید بین پارامتر هاتون ویرگول بگذارید.
بعد از پارامتر اگر پارامتر دیگری دارید باید ویرگول بگذارید تا تعریفش با قبلی مجزا بشه.
اگر دقت کنید می بینید که به اولی در تعریف کاری نداره و به دومی گیر داده.
موفق باشید.

Ring Eshgh
جمعه 16 دی 1390, 18:45 عصر
سلام

من میخوام از Stored Proceduer زیر ، در Tabels دیگه که فقط چند Filed که مد نظرمه عمل Insert رو انجام بدم در TB مختلف چه جوری میشه این کارو کرد .(جداول کاملا مختلف و مجزا با رکورد های خاص)



CREATE PROCEDURE insertGuest
@FirstName nchar(10),
@LastName nchar(10),
@City nchar(10),
@Country nchar(10),
@Address ntext,
@ZipCode numeric,
@Phone numeric,
@Passport numeric,
@GuestID tinyint output
AS
BEGIN
insert into TBGuest
(FirstName,LastName,City,Country,Addres,ZipCode,Ph one,Passport)
values
(@FirstName,@LastName,@City,@Country,@Address,@Zip Code,@Phone,@Passport)
set @GuestID=@@identity
END
GO

Ring Eshgh
پنج شنبه 29 دی 1390, 10:48 صبح
سلام
من میخوام تو سه Table زیرجستوجو انجام بدم اما Error هاشونتونستم بگیرم ممنون میشم کمکم کنید.



Create PROCEDURE Search
@GuestID int,
@GFirstName nchar(10),
@LastName nchar(10),
@Pasport numeric(13,0),
@ReceivedID int,
@DateIn datetime,
@RoomID int,
@Floor int
AS
BEGIN
SELECT GuestID , GFirstName , GLastName , Pasport,TBReceivedID.GuestID ,DateIn , TBRoom.ReceivedID , RoomID, Floor
FROM TBGuest LEFT JOIN TBReceived LeftJoin TBRoom ON TBGuest.GuestID = TBReceived.GuestID= TBRoom.ReceivedID
WHERE ( GFirstName LIKE RTRIM(LTRIM(@GFirstName))+ N'%' ) AND
( GLastName LIKE RTRIM(LTRIM(@GLastName)) + N'%' )AND
( Pasport = @Pasport OR @Pasport = 0 ) AND
( TBReceived.DateIn=@DateInOR@DateIn=0 ) AND
( TBRoom.RoomID=@RoomIDOR@RoomID=0 )AND
( TBRoom.@Floor= @Floor OR @Floor = 0 )
END



TBGuest : P.K & F.K GuestIDint,GFierstName nchar(10),GLastName nchar(10),City nchar(10),Countery nchar(10),
Address ntext,ZipeCode numeric(13,0),Phone numeric(12,0),Pasportnumeric(13,0)


TBRoom : P.K & F.K RoomIDint,F.K ReceivedID int,Floor int,Beds int,RoomType nchar(10),Money money,Moneyntext


TBReceived : P.K & F.K ReceivedIDint,F.K GuestID int,F.K RoomID int,DateIN datetim,DateOut datetim,Amount money

Galawij
پنج شنبه 29 دی 1390, 11:26 صبح
سلام،
خطا که زیاد داره،
ساختار Join ها تون باید به صورت باشه:
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
برای شرط where هم یک مثال می ذارم:
WHERE ((@IdContract=0)OR(dbo.TbContract.IdContract = @IdContract))
AND
((@IdFields=0)OR(dbo.TbFields.IdFields = @IdFields))
AND
((@IdCertificate=0)OR(dbo.TbCertificate.IdCertific ate = @IdCertificate))
AND
((@IdSeason=0)OR(dbo.TbSeasons.IdSeason = @IdSeason))

Ring Eshgh
پنج شنبه 29 دی 1390, 12:00 عصر
واسه کد Insert بالا چی روشی نیست واسه حلش ؟

Ring Eshgh
پنج شنبه 29 دی 1390, 12:28 عصر
بازم Error داره داداش من سه جدول دارم نه دو جدول ممنون میشم ویرایشش کنید یا Edite خودتونو واسم بزارین.

ممنون

Galawij
پنج شنبه 29 دی 1390, 12:41 عصر
ببینید این الان سه جدوله:
81085
و Query مورد نظر به این صورت می شه:
SELECT dbo.TbAccessLevel.IdAccessLevel, dbo.TbMainPages.IdMainPage, dbo.aspnet_Users.UserId
FROM dbo.TbAccessLevel INNER JOIN
dbo.TbMainPages ON dbo.TbAccessLevel.Id_MainPage = dbo.TbMainPages.IdMainPage INNER JOIN
dbo.aspnet_Users ON dbo.TbAccessLevel.Id_User = dbo.aspnet_Users.UserId

Ring Eshgh
جمعه 30 دی 1390, 10:23 صبح
سلام


من دستورو تغییر دادم به این شکل اما از جای Endباز Error داره نمیدونم چرا ممکنه مجدد کمکم کنید تا حل شه مشکل ؟




Create PROCEDURE SearchGuest

@GuestID int,

@GFierstName nchar(10),

@GLastName nchar(10),

@Pasport numeric(13,0),

@ReceivedID int,

@DateIn datetime,

@RoomID int,

@Floor int

AS

BEGIN

SELECT TBGuest.GuestID , Guest.GFirstName , Guest.GLastName ,Guest.Pasport,TBReceivedID.GuestID , TBReceivedID.DateIn,

TBReceivedID.TBRoom , TBRoom.ReceivedID , TBRoom.RoomID, TBRoom.Floor

FROM TBGuest Inner JOINTBReceived ON TBGuest.ReceivedID = TBReceived.ReceivedID Inner JOIN TBRoom ONTBGuestID=TBRoom.RoomID

WHERE ( TBGuest.GFierstName LIKE RTRIM(LTRIM(@GFierstName)) + N'%' ) AND

( TBGuest.GLastName LIKE RTRIM(LTRIM(@GLastName))+ N'%' ) AND

( ( TBGuest.Pasport = @Pasport) OR (@Pasport = 0) ) AND

( (TBReceived.DateIn=@DateIn)OR (@DateIn=0) ) AND

( (TBRoom.RoomID=@RoomID)OR ((@RoomID=0 ) )AND

( (TBRoom.Floor = @Floor) OR (@Floor = 0) )

END



TBGuest : P.K& F.K GuestID int,GFierstName nchar(10),GLastName nchar(10),Citynchar(10),Countery nchar(10),

Address ntext,ZipeCode numeric(13,0),Phone numeric(12,0),Pasportnumeric(13,0)

TBRoom : P.K& F.K RoomID int,F.K ReceivedID int,Floor int,Beds int,RoomTypenchar(10),Money money,Money ntext

TBReceived : P.K& F.K ReceivedID int,F.K GuestID int,F.K RoomID int,DateINdatetim,DateOut datetim,Amount money

Galawij
جمعه 30 دی 1390, 22:23 عصر
شما دقت کنید وقتی پارامترها را در شرط Where معادل صفر قرار می دید، بهشون هم مقدار اولیه صفر بدید. یعنی:
Create PROCEDURE SearchGuest
@GuestID int=0,.....
اگر امکان داره خطا را هم بذارید تا بشه دقیقتر بررسی کرد. فکر می کنم این طریق نوشتن شرط درست نباشه و باید با SQL پویا نوشته شود.
WHERE ( TBGuest.GFierstName LIKE RTRIM(LTRIM(@GFierstName)) + N'%' )
باید امتحان کنم...

Ring Eshgh
جمعه 30 دی 1390, 23:28 عصر
MSG 125, Level 15, State 1, PROCEDURE SearchGuest, Line 24
Incorrect Syntax Near The Keyword 'End' .

Ring Eshgh
جمعه 30 دی 1390, 23:29 عصر
من برنامم کامل UP کردم ممنون میشم نگاشم کنید با VB.Net نوشتم.
(http://s2.picofile.com/file/72573441...nager.rar.html (http://s2.picofile.com/file/7257344187/Programmebel_Hotel_Manager.rar.html))

Galawij
شنبه 01 بهمن 1390, 08:06 صبح
سلام،
دوست عزیز من VB کار نیستم، Script های شما را دیدم، شرط Where را هم چک کردم مشکلی نداشت. اشکال کار شما در Join این جداول است. دو جدول وقتی با هم Join می شوند که کلید اصلی جدول اول در جدول دوم آورده شده باشد، در صورتی که این نکته رعایت نشده باشد اتصال از نوع Inner Join آنها امکان پذیر نیست. شما هیچ ارتباطی بین جداول TBGuest و TBRoom ندارید، در صورتی که بین آنها اتصال برقرار کردید. پیشنهاد می کنم این لینک (http://dotnetslackers.com/articles/sql/SQL-SERVER-JOINs.aspx) را مطالعه کنید.
نکته: بسته به اینکه کلید خارجی هم قابلیت ALLOW NULL داشته باشد یا نه، نوع JOIN متفاوت است.
پیشنهاد: در تعیین نوع داده فیلدها هم دقت بیشتری به خرج بدید.
موفق باشید.

Ring Eshgh
شنبه 01 بهمن 1390, 13:00 عصر
سلام

مرسی از راهنماییتون اما اگه واسم مثال میزدین بهتر متوجه میشودم .
من که یک F.K تو TBReceived و TBRoom گذاشنم که و از طریق TBReceived به TBGuest هم دست رسی دارم که ! پس چجوری میشه ؟
یعنی من که در آخر میخوام Check Allow Null رو بردارم چه شکلی Query باید بنویسم (یعنی تغییراتش چی میشه).

Galawij
شنبه 01 بهمن 1390, 13:23 عصر
عزیز من، این لینک (http://http://stackoverflow.com/questions/2100219/join-three-tables-in-sql-server-2005) را نگاه کنید به عنوان مثال...
جواب نگرفتید، اسکریپت جداول را بذارید تا درستش کنم.

Ring Eshgh
شنبه 01 بهمن 1390, 15:36 عصر
سلام



آقا من خودمو کشتم بازم نشوداینم مثل Edit که مسالی که واسم گزاشتین انجامدادم اما بازم همون Error قبلو به من میده.


Create PROCEDURE SearchGuest

@GuestID int,

@GFierstName nchar(10),

@GLastName nchar(10),

@Pasport numeric(13,0),

@ReceivedID int,

@DateIn datetime,

@RoomID int,

@Floor int



AS

BEGIN

SELECT TBReceived.ReceivedID , TBReceived.GuestID ,TBReceived.RoomID , TBReceived.DateIn , TBGuest.GuestID , Guest.GFirstName ,Guest.GLastName ,

Guest.Pasport , TBRoom.RoomID , TBRoom.Floor



FROM TBRoom as TBReceived inner join TBGuest as TBroom onTBReceived.GuestID=GuestID.GuestID

InnerJoin TBRoom as TBReceived on TBRoom.RoomID=TBReceived.ReceivedID



WHERE ( TBGuest.GFierstName LIKERTRIM(LTRIM(@GFierstName)) + N'%' ) AND



( TBGuest.GLastName LIKE RTRIM(LTRIM(@GLastName))+ N'%' )AND



( ( TBGuest.Pasport = @Pasport) OR (@Pasport = 0) ) AND



( (TBReceived.DateIn=@DateIn)OR (@DateIn=0) ) AND



( (TBRoom.RoomID=@RoomID)OR ((@RoomID=0 ) )AND



( (TBRoom.Floor = @Floor) OR (@Floor = 0) )



END





-----------------Table-------------------



TBGuest : P.K & F.K GuestID int,GFierstNamenchar(10),GLastName nchar(10),City nchar(10),Countery nchar(10),

Address ntext,ZipeCode numeric(13,0),Phonenumeric(12,0),Pasport numeric(13,0)



TBRoom : P.K & F.K RoomID int,F.K ReceivedIDint,Floor int,Beds int,RoomType nchar(10),Money money,Comment ntext



TBReceived : P.K & F.K ReceivedID int,F.K GuestIDint,F.K RoomID int,DateIN datetin,DateOut datetime, Amount money

-----------------------------------------------------------------------------------------------------------





اینم از کد قبلیم :


Create PROCEDURE SearchGuest

@GuestID int,

@GFierstName nchar(10),

@GLastName nchar(10),

@Pasport numeric(13,0),

@ReceivedID int,

@DateIn datetime,

@RoomID int,

@Floor int

AS

BEGIN

SELECT TBGuest.GuestID , Guest.GFirstName , Guest.GLastName,Guest.Pasport,TBReceivedID.GuestID , TBReceivedID.DateIn,

TBReceivedID.TBRoom , TBRoom.ReceivedID , TBRoom.RoomID, TBRoom.Floor

FROM TBGuest Inner JOINTBReceived ON TBGuest.ReceivedID =TBReceived.ReceivedID Inner JOIN TBRoom ONTBGuestID=TBRoom.RoomID

WHERE ( TBGuest.GFierstName LIKE RTRIM ( LTRIM ( @GFierstName ) ) + N'%') AND

( TBGuest.GLastName LIKE RTRIM ( LTRIM( @GLastName ) )+ N'%' ) AND

( ( TBGuest.Pasport = @Pasport ) OR ( @Pasport= 0 ) ) AND

( ( TBReceived.DateIn=@DateIn (TBReceived.DateIn=@DateIn) ) OR ( @DateIn=0 )) AND

( ( TBRoom.RoomID=@RoomID (TBRoom.RoomID=@RoomID) ) OR (@RoomID=0 )) AND

( ( TBRoom.Floor = @Floor ) OR ( @Floor = 0 )

END
-----------------------------------------------------------------------------------------------------------------------------


Error


MSG125, Level 15, State 1, PROCEDURESearchGuest, Line 24
Incorrect Syntax near The Keyword ‘End’




ممنون میشم این مشکلو حلش کنید تا اجرا شه.

Galawij
شنبه 01 بهمن 1390, 21:42 عصر
سلام،
فکر می کنم از اول هم باید بانک را پیاده می کردم. روال مورد نظر به این صورت درمیاد:

ALTER PROCEDURE [dbo].[SearchGuest](@GuestID int=0,@GFierstName nchar(10)=null,@GLastName nchar(10)=null,@Pasport numeric(13,0)=0,@ReceivedID int=0,@DateIn datetime=null,@RoomID int=0,@Floor int=0)
AS
BEGIN
SELECT
dbo.TBReceived.ReceivedID, dbo.TBReceived.Guest_ID, dbo.TBReceived.Room_ID, dbo.TBGuest.GFierstName, dbo.TBGuest.GLastName, dbo.TBReceived.DateIN,
dbo.TBRoom.Floor, dbo.TBGuest.Pasport
FROM dbo.TBGuest INNERJOIN dbo.TBReceived ON dbo.TBGuest.GuestID = dbo.TBReceived.Guest_ID INNERJOIN dbo.TBRoom ON dbo.TBReceived.Room_ID = dbo.TBRoom.RoomID
WHERE (TBGuest.GFierstName LIKERTRIM(LTRIM(@GFierstName))+ N'%')AND
(TBGuest.GLastName LIKERTRIM(LTRIM(@GLastName))+ N'%')AND
((TBGuest.Pasport = @Pasport)OR(@Pasport = 0))AND
((TBReceived.DateIn=@DateIn)OR(@DateIn=0))AND
((TBRoom.RoomID=@RoomID)OR((@RoomID=0)))AND
((TBRoom.Floor= @Floor)OR(@Floor = 0))
END
این هم یک عکس از جداول و ارتباط بین آنها:
81246

Ring Eshgh
شنبه 01 بهمن 1390, 22:06 عصر
آقا ممنون لطف کردی اما بازم Error داره اینم Error ش

Msg 102, Level 15, State 1, Procedure SearchGuest, Line 14
Incorrect syntax near 'TBReceived'.

واسه Insert در There Table تو پس اولیه که تو همین تاپیک گذاشتم راهی سراغ ندارین ؟

Ring Eshgh
شنبه 01 بهمن 1390, 22:17 عصر
من چک کردم در Guest_ID اشتیاه بود GuestID اینجوری تو Table گرفتم ایرادشو اما باز این Error داد.

من متنی که گزاشتین Copy Paset کردم.

Msg 102, Level 15, State 1, Procedure SearchGuest, Line 14
Incorrect syntax near 'dbo'.

Galawij
یک شنبه 02 بهمن 1390, 18:33 عصر
سلام،
بانک را براتون می ذارم، چون از Sql Server 2005 استفاده می کنید، من Script بانک را براتون می ذارم، کافیه یک بانک جدید درست کنید و این Query را روی آن اجرا کنید.

امیدوارم مشکلتون حل بشه...