我在Visual Basic .Net App中有一个搜索屏幕,其中包含以下文本框:
如何在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'
答案 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默认值。