View Full Version : مشکل با این SP دارم
seeco1234
دوشنبه 17 آبان 1389, 19:59 عصر
سلام به همه بچه ها و خسته نباشید. تو این sp یه جا گیر کردم که "؟" گذاشتم:
create PROCEDURE [dbo].[SP_Select_PersonelTest]
@p1 int,
@p2 varchar(20)
as
if @p1 IS NULL
set @p1 = '?'
SELECT [nPersonelId]
,[cPersonelNo]
,[cFName]
,[cLName]
,[cFatherName]
,[cIdNo]
FROM tblPersonel
where (nPersonelId=@p1 and cPersonelNo =@p2)
مشکل اینه که من وقتی پارامتر p1 رو از تو برنامه پاس ندم و فقط p2 رو پاس بدممیخوام این درست عمل کنه.(فیلتر 2 منظوره در برنامه که بر اساس هر کدام و یا هر دو با هم عمل میکند)
ممنون از راهنمایی شما
حمیدرضاصادقیان
دوشنبه 17 آبان 1389, 20:07 عصر
سلام.نه دیگه این اشتباه هست.یا باید جفتش مقدار داشته باشه یا هیچکدوم وگرنه در شرط شما بهتون جواب نمیده.برای اینکه جواب درست بگیرید در شرط where باید از Or استفاده کنید. همچنین برای تعریف پارامترها میتونید به صورت Default تعریف کنید که اگر مقداری بهش ندادی باهمون مقدار خودش پاس داده بشه.
بعد همون رو در شرط به جای is null چک کنید.برای تعریف Default Value هم کافیه جلوی پارامتر تعریف شده در sp یک = گذاشته و یک مقدار بهش بدید.
موفق باشید
seeco1234
دوشنبه 17 آبان 1389, 20:19 عصر
ممنونم از پاسخت ولی مثلا من میخوام یه سرچ تو app داشته باشم که بر اساس نام یا نام خانوادگی یا هر دو با هم باشه.
خب من نام خانوادگی رو Default چی بدم آخه که موقعی که من انتخابش نمیکنم فقط بر اساس نام فیلتر انجام بشه.؟
ممنون
حمیدرضاصادقیان
دوشنبه 17 آبان 1389, 20:35 عصر
سلام.پس اگر براساس نام و نام خانوادگی هست این کد اشتباه است.زیرا شمادارید در جستجو براساس کد پرسنل یا نام اون جستجو میکنید .با این اوصاف حتما نام و نام خانوادگی رو در یک فیلد وارد کردید>؟؟
اگر اینطوری هست چطوری میخواهید براساس هردو جستجو کنید؟؟؟فقط باید با استفاه از like روی اون فیلد نام جستجو انجام بدید.
seeco1234
دوشنبه 17 آبان 1389, 20:40 عصر
نه حق با شماست. من مثال عرض کردم. ممکنه فیلترها 5 مورد باشند.
کلی و مثال عرض کردم .شما همون نام و نام خانوادگی و کد پرسنلی هرکدام فیلد جدا در نظر بگیرید
حمیدرضاصادقیان
دوشنبه 17 آبان 1389, 21:05 عصر
خوب به این صورت باشه که خیلی راحته. برای فیلدها مقدار Default در نظر میگیرید که اگر چیزی وارد نشد ' ' قرار دهد یعنی یک فاصله.بعد در شرط if ابتدا کنترل میکنید که اگر برابر فاصله بود شرط where فقط یک مقدار را چک کند در غیر اینصورت باید هردو مقدار رو چک کند.
به این روش کار کردن میگن dynamic Query. که شما در داخل یک رشته ابتدا شرط خود را کامل میکنید بعد با استفاده از دستور sp_executesql اونو اجرا میکنید.
موفق باشید.
seeco1234
دوشنبه 17 آبان 1389, 22:02 عصر
منظورتون به این شکله؟
create PROCEDURE [dbo].[SP_Select_PersonelTest]
@p1 nvarchar(20),
@p2 nvarchar(20)
as
SET NOCOUNT ON
begin
if @p2 IS NULL
SELECT [nPersonelId],[cPersonelNo],[cFName]
FROM tblPersonel where (cFName=@p1 )
if @p1 is null
SELECT [nPersonelId],[cPersonelNo],[cFName]
FROM tblPersonel where (cPersonelNo =@p2 )
end
if (@p1 is not null) and (@p2 is not null)
SELECT [nPersonelId],[cPersonelNo],[cFName]
FROM tblPersonel where (cFName=@p1 and cPersonelNo =@p2)
اونوقت اگه 10 تا فیلتر داشته باشیم چند حالت باید کوئری بنویسیم؟؟؟؟
Reza_Yarahmadi
سه شنبه 18 آبان 1389, 07:42 صبح
روش اول:
create PROCEDURE [dbo].[SP_Select_PersonelTest]
@p1 nvarchar(20) = '%',
@p2 nvarchar(20) = '%'
as
Select
[nPersonelId],
[cPersonelNo],
[cFName]
FROM
tblPersonel
Where
cFName LIKE @p1
AND
cPersonelNo LIKE @p2
روش دوم:
create PROCEDURE [dbo].[SP_Select_PersonelTest]
@p1 nvarchar(20) = '',
@p2 nvarchar(20) = ''
--as
Declare @Str nvarchar(max)
Set @Str = ''
if(@p1 = '')
Set @Str = ' Where cFName like ' + @p1
if(@p2 = '')
if(@Str = '')
Set @Str = ' Where cPersonelNo like ' + @p2
else
Set @Str = @Str + ' AND cPersonelNo like ' + @p2
Set @Str = 'Select
[nPersonelId],
[cPersonelNo],
[cFName]
FROM
tblPersonel' + @Str
exec (@Str)
روش دوم تقريبا چيزي است كه جناب صادقيان فرمودند
روش اول كد نويسي كمي داره ولي بدليل اينكه شرطهاي بي استفاده زياد ميشه سرعت پردازش پاييني داره
روش دوم كد نويسي بيشتري داره ولي براي گرفتن يك كوئري معمولي (فقط يك Select) سرعت مناسبي داره.
seeco1234
سه شنبه 18 آبان 1389, 18:22 عصر
آقای یار احمدی خدا خیرت بده. همچنین آقای صادقیان. با راهنماییتون کد به صورت زیر دراومد:
create PROCEDURE [dbo].[SP_Select_PersonelTest2]
@p1 nvarchar(max)
AS
SET NOCOUNT ON
Set @p1 = 'SELECT [nPersonelId],[cPersonelNo],[cFName]
FROM tblPersonel ' + @p1
exec (@p1 )
من دیگه شرطامو اینجا چک نمیکنم. رو کلاینتم تمام فیلترها بررسی میشه و نهایتا یه جمله مثلا به شکل زیر درمیاد که اون جمله رو پاس میدم به sp:
where ... and ... and.... or...
فقط چیزی که خیلی منو اذیت کرد این بود که من این روند رو بهش فکر کرده بودم منتهی اینطور مینوشتم:
SELECT [nPersonelId],[cPersonelNo],[cFName]
FROM tblPersonel + @p1
که از شما یاد گرفتم چطوری به طور صحیح exec اش کنم.
بازم بسیار بسیار تشکر میکنم ازتون که خیلی جاهای برنامه من کاربرد داشت.
اگه بازم تو کوئری موردی هست بگید.
1 سوالم دارم. متغیرهایی که تعریف میشند فرقشون با اونایی که با Declare تعریف میشند چیه؟
اولیا رو که میدونم برا ورودی هست. آیا Declare شده ها متغیراییند که تو کوئری استفاده دارند؟
ممنون
حمیدرضاصادقیان
سه شنبه 18 آبان 1389, 18:54 عصر
سلام.
سوالم دارم. متغیرهایی که تعریف میشند فرقشون با اونایی که با Declare تعریف میشند چیه؟
اولیا رو که میدونم برا ورودی هست. آیا Declare شده ها متغیراییند که تو کوئری استفاده دارند؟
بله مورد اول به صورت پارامتر ازش استفاده میشه و مواردی که داخل خود sp ایجاد می شوند فقط در محدوده اون کوئری قابل استفاده هستند و نمیشه مقداری بهشون پاس داد.
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.