SQL Server 2000中的多参数搜索

时间:2009-02-10 22:34:32

标签: sql sql-server vb.net

我在Visual Basic .Net App中有一个搜索屏幕,其中包含以下文本框:

  1. 名字Varchar(50)
  2. 姓氏Varchar(50)
  3. 中间名Varchar(50)
  4. DOB DateTime
  5. 家庭电话Varchar(10)
  6. Work Phone Varchar(10)
  7. 如何在SQL Server 2000中创建一个存储过程,使我能够搜索所有/部分/一个字段。如果用户只输入说出名字和家庭电话号码的数据,那么对于未输入数据的其余参数,我需要做什么。我尝试了下面的select语句,但它无法正常工作。

        Select Last_Name, First_Name, Mid_Name, DOB, Home_Phone, Work_Phone from dbo.tblClient
    Where Last_Name Like '%@LastName' and
        First_Name Like '%@FirstName' and
        Mid_Name Like '%@MiddleName' and
        DOB Like '%DOB' and
        Home_Phone Like '%@HomePhone' and
        Work_Phone Like '%@WorkPhone'
    

6 个答案:

答案 0 :(得分:3)

我经常使用这种模式:

Select Last_Name, First_Name, Mid_Name, DOB, Home_Phone, Work_Phone from dbo.tblClient
Where (@LastName is null or Last_Name Like '%'+ @LastName)
and (@FirstName is null or First_Name Like '%'+ @FirstName)
and (@HomePhone is null or Home_Phone Like '%'+ @HomePhone)
-- etc...

Select Last_Name, First_Name, Mid_Name, DOB, Home_Phone, Work_Phone from dbo.tblClient Where (@LastName is null or Last_Name Like '%'+ @LastName) and (@FirstName is null or First_Name Like '%'+ @FirstName) and (@HomePhone is null or Home_Phone Like '%'+ @HomePhone) -- etc...

它会忽略任何未提供的内容,同时仍能提供良好的性能。更好的是,它不依靠动态SQL来实现它。

答案 1 :(得分:0)

这样做的快捷方式就像

其中(Last_Name喜欢@LastName +'%'或@LastName为空)和     (First_Name喜欢@FirstName +'%'或@FirstName IS NULL)和 等...

Erland Sommarskog有一些很好的文章介绍了不同的方法及其表现的影响here

答案 2 :(得分:0)

在您的存储过程或VB中,您将不得不决定如何处理无输入。例如,我使用:

IF ltrim(rtrim(@FirstName)) = ''
SET @FirstName = null

...在我的存储过程中。您可能需要尝试使用OR而不是AND。您基本上是在告诉您的查询,您必须使用AND来满足所有这些条件,无论是否有任何输入。

答案 3 :(得分:0)

一个快速的解决方案。

Select Last_Name, First_Name, Mid_Name, DOB, Home_Phone, Work_Phone from dbo.tblClient
Where (Last_Name Like '%' + @LastName OR @LastName Is Null) and
(First_Name Like '%' + @FirstName OR @FirstName Is Null) and
(Mid_Name Like '%' + @MiddleName OR @MiddleName Is Null) and
(DOB Like '%' + @DOB OR @DOB Is Null) and
(Home_Phone Like '%' + @HomePhone OR @HomePhone Is Null and
(Work_Phone Like '%' + @WorkPhone OR @WorkPhone Is Null)

注意我已更正参数用法。您是否也想在参数的另一侧使用通配符?你真的会使用Like to a Birth of Birth字段吗?

这在大型桌面上表现不佳。一个更高效的解决方案是使用Where子句中的必需字段构造SQL。

答案 4 :(得分:0)

只是为了澄清原始SQL不起作用的原因;

您需要将%通配符连接到参数值,但您所写的是创建一个包含通配符和参数名称的文字字符串,例如。

Work_Phone Like '%@WorkPhone'

应该写成

Work_Phone Like '%' + @WorkPhone

如果您为没有输入值的参数返回空字符串(即返回“”,而不是NULL),那么您应该使用的SQL - 那些字段的Like比较将只包含%wildcard(即匹配任何值)。但是,这不是很有效,因为理想情况下,您只想对用户输入值的字段进行比较。这可能需要一些动态生成的SQL,如kenj链接的文章中所示。

如果您的tblClient表不是那么大,那么您所做的就足够了。

答案 5 :(得分:0)

如何使用ISNULL()函数来确定是否已将值传递到存储过程中,如果没有,则设置WHERE子句字段值以在每种情况下搜索等于其自身(如果有人能想到的话)为了描述这个,我会更好地选择单词,我会更新答案)。

 SELECT 
     Last_Name, 
     First_Name, 
     Mid_Name, 
     DOB, 
     Home_Phone, 
     Work_Phone 
 FROM 
     dbo.tblClient
 WHERE 
    Last_Name LIKE '%' + ISNULL(@LastName, Last_Name) AND
    First_Name LIKE '%' + ISNULL(@FirstName, First_Name) AND
    Mid_Name LIKE '%' ISNULL(@MiddleName, Mid_Name) AND
    DOB LIKE '%' + ISNULL(@DOB, DOB) AND
    Home_Phone LIKE '%' + ISNULL(@HomePhone, Home_Phone) AND
    Work_Phone LIKE '%' + ISNULL(@WorkPhone, Work_Phone) 

您还可以为每个存储过程参数设置NULL默认值。