2012-09-07 156 views
0

My Search Box通過字段名稱作爲存儲過程的參數

我要在選定的組合框項目上的搜索詞(文本框)(數據庫字段), 我的存儲過程是:

USE [QueueDB] 
GO 
/****** Object: StoredProcedure [dbo].[SP_SelectDriver_ByNameAndField] Script Date: 09/07/2012 17:20:24 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField] 
@Word nvarchar(100), 
@Field nvarchar(100) 
AS 
BEGIN 
select * from Driver where @Field like + N'%' + @Word + '%' 
END 

它不起作用,您建議採用什麼方式來執行此搜索方法?

+0

您如何看待Sql Server中會預編譯此查詢計劃?我建議使用動態SQL。什麼將調用存儲過程? – Jodrell

回答

0

Azize德爾,

組合框hamishe baiangare查找AST科hamanande表EIST柯2 sotoune編號VA描述者darad。 Agar gharar ast meghdare entekhabie ComboBox be StoredProcedure ferestade beshe,pishnahad mikonam az Id e Bind shind be SelectedValue e ComboBox estefade beshe。 Nvarchar ro be SP ferestadan kare dorosti nist。

尊敬的先生/女士,

組合框始終是查找信息系統的替代品就是喜歡一個只有兩列,Id和描述者的表。如果您要將ComboBox的SelectedValue發送到您的StoredProcedure,我建議將SelectedValue的綁定值作爲整數發送給它。然後你有很多選項來編寫你的查詢。通過使用Nvarchar發送LookUp值可能會在您的應用程序的將來產生很多副作用(與排序相比,它有許多問題)。

乾杯

更改代碼這樣:

USE [QueueDB] 
GO 
/****** Object: StoredProcedure [dbo].[SP_SelectDriver_ByNameAndField] Script Date: 09/07/2012 17:20:24 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField] (
    @Word Nvarchar(100) 
, @Field TinyInt 
) As Begin 

    Select * 
     From Driver 
     Where Case When @Field  = 1 
       And Column1  Like + N'%' + @Word + '%' 
       Then 1 
       When @Field  = 2 
       And Column2  Like + N'%' + @Word + '%' 
       Then 1 
       When @Field  = 3 
       And Column3  Like + N'%' + @Word + '%' 
       Then 1 
       Else 0 
      End = 1 
    ; 

    Return 0; 

END 

您也可以用另外一種方式:

USE [QueueDB] 
GO 
ALTER PROCEDURE [dbo].[SP_SelectDriver_ByNameAndField] (
    @Word Nvarchar(100) 
, @Field TinyInt 
) As Begin 

    Declare @Command Nvarchar(Max); 

    Select @Command = N' 
    Select * 
     From Driver 
     Where ' 
    + Case When @Field  = 1 
       Then 'Column1' 
       When @Field  = 2 
       Then 'Column2' 
       When @Field  = 3 
       Then 'Column3' 
       Else 'DefaultColumn' 
      End 
    + N' Like + N''%' 
    + @Word 
    + N'%''' 
    ; 

    Execute (@Command); 

    Return 0; 

END 
+1

-1。英語請... –

+1

@flem提問者是伊朗人,我們所有人都有很多學習英語的問題。請耐心等待,我也會添加英文評論。只爲你。 ;)乾杯 – Rikki

+0

謝謝穆罕默德,解決方案是如此有用,並幫助我,在此先感謝,Mamnoon;) – Moslem7026

2

您不能在SQL中使用動態列名稱。

爲了達到你想要的,你將需要使用dynamic SQL。鏈接的文章對此主題進行了全面的討論。

+0

如果不可能我該怎麼辦?爲組合框中的每個項目編寫存儲過程? – Moslem7026

+0

你可以這樣做,或者你可以構造查詢並將它傳遞給'sp_executeSql',或者如果你使用ADO.Net'command'類,它會爲你做。但是,這假設了一些關於你的客戶的事情我建議你調查Oded發佈的鏈接。該網站的其他部分也非常翔實。 – Jodrell

相關問題