ورود

View Full Version : راهنمایی کنید: یک راه بهتر برای جلوگیری از تکرار در این Query



fa_karoon
پنج شنبه 10 مرداد 1392, 17:19 عصر
GO
/****** Object: StoredProcedure [dbo].[NewStudents] Script Date: 07/27/2013 12:18:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[NewStudents]
(
@P0 as varchar(255)=Null
)
AS
BEGIN
if (@P0 Is Not Null)
SELECT 0,StudentID,
FullName + ' - ' + cast(FolderNumber as nvarchar) As Name,
ImagePath
FROM Student
WHERE StudentID Not In (Select StudentID From Register)
AND StudentID Not In (Select StudentID From Test)
And CharIndex(Cast(StudentID as nvarchar(255)),@P0)=0
AND IsDeleted=0
Else
SELECT 0,StudentID,
FullName + ' - ' + cast(FolderNumber as nvarchar) As Name,
ImagePath
FROM Student
WHERE StudentID Not In (Select StudentID From Register)
AND StudentID Not In (Select StudentID From Test)
AND IsDeleted=0
END


دوستان سلام در این استور پروسی جر من می خوام وقتی متغیر ورودی مقدار داره اون شرط charIndex انجام بشه اما وقتی مقدار نداره اصلا نمی خوام اون شرط انجام بشه
تو اون شرط هم یه سری StudentID رو به صورت رشته براش می فرستم می خوام اگر StudentID تو اون رشته نبود مقدار رکورد رو برگردونه
لطفا راهنمایی کنید می شه یه جوری نوشت این کد رو که نخوام شرط بذارم و به خاطر یه خط تفاوت Select رو دوبار تکرار نکنم
مرسی

محمد سلیم آبادی
پنج شنبه 10 مرداد 1392, 18:27 عصر
به عنوان یک جواب سریع:
GO
/****** Object: StoredProcedure [dbo].[NewStudents] Script Date: 07/27/2013 12:18:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[NewStudents]
(
@P0 as varchar(255)=Null
)
AS
BEGIN
if (@P0 Is Not Null)
SELECT 0,StudentID,
FullName + ' - ' + cast(FolderNumber as nvarchar) As Name,
ImagePath
FROM Student
WHERE StudentID Not In (Select StudentID From Register)
AND StudentID Not In (Select StudentID From Test)
And 1 = CASE WHEN @P0 IS NULL THEN 1
ELSE CASE WHEN CharIndex(Cast(StudentID as nvarchar(255)),@P0)=0 THEN 1
ELSE 0
END
END
AND IsDeleted=0

END

محمد سلیم آبادی
پنج شنبه 10 مرداد 1392, 18:56 عصر
البته اگر میخواهید طول کدتان از آنچه که در پست قبلی اشاره شد کمتر باشد میتونید گزینه Dynamic SQL رو انتخاب کنید!
به این شکل:
ALTER PROCEDURE [dbo].[NewStudents]
(
@P0 as varchar(255)=Null
)
AS
BEGIN
declare @sql varchar(max)
set @sql = '
SELECT 0,StudentID,
FullName + '' - '' + cast(FolderNumber as nvarchar) As Name,
ImagePath
FROM Student
WHERE StudentID Not In (Select StudentID From Register)
AND StudentID Not In (Select StudentID From Test)
AND IsDeleted=0
'
print @sql
if (@P0 Is Not Null)
set @sql += 'AND CharIndex(Cast(StudentID as nvarchar(255)),@P0)=0'

execute(@sql)
END

fa_karoon
پنج شنبه 10 مرداد 1392, 19:51 عصر
واقعا ممنون از جوابتون
تو حالت دوم چون من به P0@ یه رشته مثل ',1,2,3,6,7' می دهم دچار خطا می شه خط بعد از شرط رو اینجوری تصحیح کردم
set @sql += 'AND CharIndex(Cast(StudentID as nvarchar(255)),' + @P0 + ')=0'
اما باز هم این خطا رو می ده

Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ','.

که به خط Where داره ایراد می گیره
به هر حال مرسی به روش اول حلش می کنم، باز هم ممنون

محمد سلیم آبادی
پنج شنبه 10 مرداد 1392, 20:13 عصر
اصلاح کنید:

set @sql += 'AND CharIndex(Cast(StudentID as nvarchar(255)),'''+@P0+''')=0'

fa_karoon
پنج شنبه 10 مرداد 1392, 22:12 عصر
نمی تونم فقط به دکمه تشکر اکتفا کنم ، باز هم ممنون، خیلی جالب بود
طاعاتتون قبول

محمد سلیم آبادی
جمعه 11 مرداد 1392, 04:17 صبح
همون دکمه تشکر کافیه!

چون من به P0@ یه رشته مثل ',1,2,3,6,7' می دهم
من از کدتون تعجب می کنم که چرا studentID رو به nvarchar255 تبدیل کردین!
اگر فرضا ID هاتون تا 1 میلیون هم برسه varchar7 کافی بود.

ضمنا از همون LIKE میشه به نتیجه رسید چیزی شبیه به این:

@P0 NOT LIKE '%' + CAST(StudentID as varchar(7)) + ',%'

fa_karoon
جمعه 11 مرداد 1392, 11:35 صبح
مرسی ، درباره تبدیل StudentID حق باشماست چون عجله داشتم فقط Copy-Paste کرده بودم
از روش Like هم ممنون فقط یه نکته ای که هست تو این روش حتما بعد از آخرین رقم هم باید ',' قرار بدیم مثل ',1,2,6' به جای '1,2,6'
باز هم ممنون، موفق باشید

محمد سلیم آبادی
جمعه 11 مرداد 1392, 13:54 عصر
یه نکته ای که هست تو این روش حتما بعد از آخرین رقم هم باید ',' قرار بدیم مثل ',1,2,6' به جای '1,2,6'
البته اگر بخواهیم جواب کاملا صحیح باشه باید یک کاما به ابتدا و یکی به انتها اضافه کنیم. دلیلش هم در ادامه توضیح میدم.
پس اگر رشته شما اول و آخر آن کاما نداشت به آن اضافه کنید (من فرض را گرفتم که قبلا اضافه شده)


@P0 NOT LIKE '%,' + CAST(StudentID as varchar(7)) + ',%'

این موضوع تنها مربوط روش like نیست. اجازه بدین با مثال مشکل charindex ای که نوشته این رو بیان کنم. فرض کنید رشته ورودی برابر با '14,20,35' خب حالا شما انتظار دارید که تنها کدهایی به غیر 14، 20 و 35 انتخاب شوند درسته؟ در حالی که کدهای 1، 4، 2، 3 و 5 نیز انتخاب نخواهند شد! در نتیجه یا از روشی که گفته برید جلو یا اینکه charindex اتان را به این شکل اصلاح کنید:
(اگر انتها و ابتدا رشته کاما نیست اضافه کنید)


CharIndex(','+Cast(StudentID as varchar(7))+',',@P0)=0