سلام
فرض کنید یک جدول داریم که دارای ستونهای 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)'
باتشکر
اصلا نیازی به کوئری داینامیک نیست
به کد زیر که نوشتم دقت کنید
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
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)