PDA

View Full Version : مشکل در دانیامیک کوئری



Iran58
شنبه 27 شهریور 1395, 07:46 صبح
سلام
فرض کنید یک جدول داریم که دارای ستونهای Sender وReceiver دارای 1000نفر متفاوت می باشند
و sp زیر را نوشته ام
ALTER Procedure [dbo].[S_test_Search] @Number nvarchar(50)
,@Sender nvarchar(100)
,@Receiver nvarchar(100)
,@Comment nvarchar(max)
,@ActionID nvarchar(100)
,@TranscriptID nvarchar(100)
,@UrgencyID nvarchar(100)
AS
Set NoCount ON
Declare @SQLQuery AS NVarchar(4000)
Declare @ParamDefinition AS NVarchar(2000)
Set @SQLQuery = '
select
*
from test
where (1=1)
'
If @Number <> ''
Set @SQLQuery = @SQLQuery + ' And (Number like' + '''%''' + '+ Number +' + '''%''' + ')'
If @Sender <> ''
Set @SQLQuery = @SQLQuery + ' And (Sender = @Sender)'
If @Receiver <> ''
Set @SQLQuery = @SQLQuery + ' And (Receiver = @Receiver)'
If @Comment <> ''
Set @SQLQuery = @SQLQuery + ' And (Comment like' + '''%''' + '+ @Comment +' + '''%'''+ ')'
If @ActionID is not null
Set @SQLQuery = @SQLQuery + ' And (Type = @ActionID)'
If @TranscriptID is not null
Set @SQLQuery = @SQLQuery + ' And (cm.TranscriptID = @TranscriptID)'
If @UrgencyID is not null
Set @SQLQuery = @SQLQuery + ' And (cm.UrgencyID = @UrgencyID)'


Set @ParamDefinition =
' @Number nvarchar(50)
,@Sender nvarchar(50)
,@Receiver nvarchar(50)
,@Comment nvarchar(max)
,@ctionID nvarchar(100)
,@TranscriptID nvarchar(100)
,@UrgencyID nvarchar(100)




Execute sp_Executesql @SQLQuery
,@ParamDefinition
,@Number
,@Sender
,@Receiver
,@Comment
,@ActionID
,@TranscriptID
,@UrgencyID

If @@ERROR <> 0 GoTo ErrorHandler
Set NoCount OFF
Return(0)

ErrorHandler:
Return(@@ERROR)



اما هنگام اجرا وقتی Sender وReceiver را با داده های مورد نظر پر میکنیم(هیچگاه nullنمی باشند)اما بازهم اطلاعات1000نفر مورد نظر را برمیگرداند نه اطلاعات اشخاصی که وارد شده اند
چگونه باید کد را اصلاح کنم که فقط اطلاعاتی نفرات مورد نظر را برگرداند نه همه را

If @Sender <> ''
Set @SQLQuery = @SQLQuery + ' And (Sender = @Sender)'
If @Receiver <> ''
Set @SQLQuery = @SQLQuery + ' And (Receiver = @Receiver)'

باتشکر

Mahmoud.Afrad
شنبه 27 شهریور 1395, 20:20 عصر
http://barnamenevis.org/showthread.php?340305-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A7%D8%B3%D8%AA%D9%88%D8%B1%D9%BE%D8%B1%D9%88%D 8%B3%DB%8C%D8%AC%D8%B1-stored-procedure

مهرداد صفا
سه شنبه 06 مهر 1395, 10:51 صبح
با سلام.
نیاز به کوئری داینامیک نیست و علاوه بر روشی که جناب Mahmoud.Afrad عزیز فرمودند، از OR هم میتونید استفاده کنید.

WHERE (@sender='' OR sender=@sender) AND (@Name='' OR name=@Name) ...