ورود

View Full Version : سوال: LIKE in the SQL



araz_pashazadeh
پنج شنبه 21 مرداد 1389, 20:21 عصر
با عرض سلام خدمت دوستان
من یک پرس و جو نوشتم که به صورت زیر هستش:

DECLARE @SearchValue nvarchar(8)='a';
DECLARE @SearchItem char(16)='[User].Name';
SELECT Name, Family, Tel
FROM [User] where Name like @SearchValue+'%'
من می خواستم یک تغییر کوچیک در قسمت مربوط به LIKE بدم به این صورت که هم مقداری که قرار مقایسه بشود را از کاربر بگیرم و هم ستونی که قرار LIKe روی آن اعمال شود.
نا گفته نمانند که من این کارم به صورت زیر انجام میدهم ولی سئوال این جاست که چرا این پرس و جو چیزی در این صورت بر نمی گردانند :متفکر:
و در ضمن خطای هم نداره.

DECLARE @SearchValue nvarchar(8)='a';
DECLARE @SearchItem char(16)='[User].Name';
SELECT Name, Family, Tel
FROM [User] where @SearchItem like @SearchValue+'%'

محمد سلیم آبادی
پنج شنبه 21 مرداد 1389, 21:25 عصر
سلام،
به اون شکل نمیشه، بایستی از شیوه ی داینامیک این کار را انجام بدین. این کد را امتحان کنید:

DECLARE @SearchValue nvarchar(8)='a';
DECLARE @SearchItem char(16)='[User].Name';
DECLARE @SQL NVARCHAR(500);
SET @SQL = 'SELECT Name, Family, Tel
FROM [User]
where ' + @SearchItem + 'like ''' + @SearchValue +'%''';
EXEC(@SQL);

araz_pashazadeh
شنبه 23 مرداد 1389, 19:05 عصر
با عرض سلام و تشکرات فراوان از کمک شما.
من از این روش استفاده کردم و برام مفید واقع شد ولی در C#‎‎ در ارسال مقادیر به SP درTableAdapter با مشکل مواجه شدم و اینم کد من هستش و خطای را هم که می ده ضمیمه کردم.

this.selectUserTableAdapter.Fill(this.accountingDa taSetDB.SelectUser, 0, "a");
وقتی من در پایگاه داده SP را اجرا می کنم و مقداری وارد نمی کنم همه اطلاعات را برام می آورد اگه من بخوام همین کار را در #C انجام بدم چه چیزی وارد کنم تا همه اطلاعات را برام بیاره؟
در ضمن در DataSet وقتی privew را می زنم و مقادیر را وارد می کنم درست کار می کنه:متفکر:

محمد سلیم آبادی
شنبه 23 مرداد 1389, 23:35 عصر
سلام،
لطفا SP را پست کنید تا بهتر بشه نظر داد.

araz_pashazadeh
یک شنبه 24 مرداد 1389, 10:59 صبح
سلام،
لطفا SP را پست کنید تا بهتر بشه نظر داد.
این کد SP من:

USE [Accounting(T.N.T)]
GO
/****** Object: StoredProcedure [dbo].[SelectّFilterUser] Script Date: 08/15/2010 11:25:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SelectّFilterUser](
@SearchItem int,
@SearchValue nvarchar(8))

AS
BEGIN
BEGIN TRY
DECLARE @SearchItemText nvarchar(32);
DECLARE @SQL NVARCHAR(1024);
--SWITCH(Customer Type = "I", "Individual", Customer Type = "S", "Shop");

if @SearchItem=0
set @SearchItemText='[User].Name'
else if @SearchItem=1
set @SearchItemText='[User].Family'
else if @SearchItem=2
set @SearchItemText='[User].UserName'
else if @SearchItem=3
set @SearchItemText='[User].DateRegister'
else if @SearchItem=4
set @SearchItemText='[User].Email'
else if @SearchItem=5
set @SearchItemText='[User].IdentityNumber'
else if @SearchItem=6
set @SearchItemText='[User].NationalId'
else if @SearchItem=7
set @SearchItemText='[User].ZipCode'
else
set @SearchItemText='[User].Name'

SET @SQL = 'SELECT [User].UserId AS [شناسه],
[User].Name AS [نام],
[User].Family AS [نام خانوادگی],
Role.NameRole AS [نـقـش],
[User].DateRegister AS [تاریخ ثبت نام],
[User].IdentityNumber AS [شماره شناسنامه],
[User].NationalId AS [کـد ملـی],
[User].ZipCode AS [کـد پستی],
[User].Address AS [آدرس],
[User].Tel AS [تـلـفـن],
[User].Fax AS [فــاکـس],
[User].Cellphone AS [هـمـراه],
[User].Email AS [E-mail],
[User].Password AS [رمز عبور],
[User].UserName AS [نام کاربری],
[User].UTCDate
FROM [User] INNER JOIN
Role ON [User].RoleId = Role.RoleId AND ' + @SearchItemText + ' like ''' + @SearchValue +'%''';

EXEC(@SQL);
END TRY
BEGIN CATCH

END CATCH
END

وقتی SP را اجرا می کنم این کد را برام تولید میکند:

USE [Accounting(T.N.T)]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[SelectّFilterUser]
@SearchItem = 0,
@SearchValue = N'a'
SELECT 'Return Value' = @return_value
GO

در کد بالا وقتی اطلاعات را بصورت زیر تغییر می دهم
@SearchValue = N'' تمام اطلاعات موجود در جدول را برام می آورد و بدون فیلتر من می خواستم بدونم چه چیزی از طرف C#‎‎‎ به SP پاس کنم تا همین نتیجه را برام بیاره؟

اینم کدی که در C#‎ برای پاس کردن مقادیر به SP و پر کردن DataSet استفاده می کنم:

this.selectUserTableAdapter.Fill(this.accountingDa taSetDB.SelectUser, 0, "a");
و خطای هم که می ده را براتون ضمینه کردم و نمای از DataSet را براتون ضمینه می کنم

ahmad_eagle2002
یک شنبه 24 مرداد 1389, 11:30 صبح
با ارسال string.empty به نتيجه دلخواهتون نمي رسيد ؟

araz_pashazadeh
یک شنبه 24 مرداد 1389, 11:44 صبح
با ارسال string.empty به نتيجه دلخواهتون نمي رسيد ؟
این روش را هم امتحان کردم ولی با خطای که در بالا ضمینه کردم مواجه می شم حتی این کد را هم قرار دادم ولی باز خطا داد:

DBNull.Value
هر کاری که به نظرم می رسید را انجام دادم ولی نتیجه نگرفتم ممنون می شم در این ضمینه من را کمک کنید:افسرده:

ahmad_eagle2002
یک شنبه 24 مرداد 1389, 12:03 عصر
فكر كنم اگر ورودي SPرا trim كنيد و از داخل برنامه ' ' (يك space) را بفرستيد مشكل حل شود

araz_pashazadeh
یک شنبه 24 مرداد 1389, 18:09 عصر
فكر كنم اگر ورودي SPرا trim كنيد و از داخل برنامه ' ' (يك space) را بفرستيد مشكل حل شود

دوست عزیز این کار شدنی نیست چون اون علامت کاراکتر هستش نه رشته در ضمن اگه به داخل SP فاصله پاس کنم اونو برام جستجو می کنه و چون من چیزی شبیه به اون ندارم برام چیزی نمی آورد.
من همه راهایی که به نظرم می رسید را امتحان کردم از دوستان کسی نیست من را در این ضمینه راهنمایی کنه:افسرده:

ahmad_eagle2002
یک شنبه 24 مرداد 1389, 22:21 عصر
اگه به داخل SP فاصله پاس کنم اونو برام جستجو می کنه و چون من چیزی شبیه به اون ندارم برام چیزی نمی آورد.


اگر ورودی SPرا Trimکنید فاصله از بین می ره و به نتیجه دلخواهتون می رسید .

در ابتدای SP این خط را قرار بدهید :


SET @SearchValue=LTRIM(RTRIM(@SearchValue))

araz_pashazadeh
دوشنبه 25 مرداد 1389, 10:38 صبح
دوست عزیز من در SP مشکلی ندارم هر نتیجه ای که می خوام برام می آورد.
من مشکلم در C#‎ هستش که در ارسال مقادیر خطا می ده و اونم همین قسمت که کدش را در زیر قرار دادم:

this.selectUserTableAdapter.Fill(this.accountingDa taSetDB.SelectUser, 0, "a");
در واقع نمی دانم رشته و عدد را چطوری به SP بفرستم؟
و خطای هم که می ده را در بالا ضمیمه کردم.

ahmad_eagle2002
دوشنبه 25 مرداد 1389, 16:43 عصر
به شما توصيه مي كنم از SP GENERATOR آقاي كرامتي استفاده كنيد كه كلاس#C را هم بهتون ميده و كار با Sp ها روهم راحت مي كنه

araz_pashazadeh
چهارشنبه 27 مرداد 1389, 15:50 عصر
به شما توصيه مي كنم از SP GENERATOR آقاي كرامتي استفاده كنيد كه كلاسC#‎ را هم بهتون ميده و كار با Sp ها روهم راحت مي كنه
ممنون از راهنمایی شما این نرم افزاری را که شما گفتین از کجا می توانم تهیه کنم:متفکر:

ahmad_eagle2002
چهارشنبه 27 مرداد 1389, 23:21 عصر
http://www.barnamenevis.org/forum/showthread.php?t=87372

araz_pashazadeh
پنج شنبه 28 مرداد 1389, 10:33 صبح
http://www.barnamenevis.org/forum/showthread.php?t=87372
از شما و همه دوستان که من را در این ضمینه راهنمایی کردن تشکر می کنم.
من جوابم را در این وب سایت پیدا کردم:
http://davidhayden.com/blog/dave/archive/2006/07/17/ConstraintExceptionWasUnhandled.aspx