بهار آموزش با تخفیف های شگفت انگیز توسینسو بهار آموزش با تخفیف های شگفت انگیز توسینسو
مانده تا پایان تخفیف
مشاهده دوره ها
0

مشکل در دانیامیک کوئری

سلام

فرض کنید یک جدول داریم که دارای ستونهای 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)'

باتشکر

پرسیده شده در 1395/06/27 توسط

2 پاسخ

0

با سلام

شرط هایی که با like چک شده اند را comment کنید و مجدد تست کنید .

پاسخ در 1395/06/27 توسط
1

سلام

لطفا 4 پارامتر ابتدایی کدتون رو هم از این فرم (<>)به این صورت اصلاح کنید.

IS NOT NULL

و قسمت مربوط به Sender ,Reciver رو به این صورت تغییر بدید.

select @SQLQuery = @SQLQuery + ' And Sender LIKE N'+''''+@Sender+'%'+''''
select @SQLQuery = @SQLQuery + ' And Sender LIKE N'+''''+@Reciver+'%'+''''
پاسخ در 1395/06/28 توسط

پاسخ شما