2012-09-07 104 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

相关问题