مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

iran

عضویت از 1394/01/31

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

  • شنبه 27 شهریور 1395
  • 08:16
تشکر میکنم

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

باتشکر 

پاسخ های این پرسش

تعداد پاسخ ها : 1 پاسخ
کاربر سایت

amirmohseni

عضویت از 1394/08/05

  • یکشنبه 10 بهمن 1395
  • 10:25

اصلا نیازی به کوئری داینامیک نیست

به کد زیر که نوشتم دقت کنید

create  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

select *
from test
where (Number like '%' + @Number + '%')
	And (@Sender = '' or Sender = @Sender)
	And (@Receiver = '' or Receiver = @Receiver)
	And (Comment   like + '%' + @Comment + '%')
	And ([Type] = @ActionID)
	And (cm.TranscriptID = @TranscriptID)
	And (cm.UrgencyID = @UrgencyID)
			
    If @@ERROR <> 0 GoTo ErrorHandler
    Set NoCount OFF
    Return(0)
  
ErrorHandler:
    Return(@@ERROR)

go

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

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

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)