我有一个SQL Server人员表:
在我的应用程序中,我有一个TextField
,用户可以输入人名全名。在后台线程上的ValueChange
我的TextField事件中,我调用Stored Procedure
来获取搜索结果。
ALTER PROCEDURE [dbo].[sp_person_search]
@fullname nvarchar(100)
AS
BEGIN
SELECT
PersonId,
FirstName,
SecondName,
LastName
FROM Person
WHERE ....
// here I have to figure out how to search a person based on just one field
END
有任何线索吗?
答案 0 :(得分:1)
解析用户输入的数据是您遇到的最糟糕情况之一。快速,编写将用'John Sm ith'
来解决问题的代码!
您最好的选择是为名称的每个部分提供输入字段,该字段与表格中的表格或数据相匹配。通常情况下,我强烈建议不要为用户增加负担,以使代码更容易。但在这种情况下,输入名字,中间(姓名或初始),姓氏几乎是所有用户界面的事实上的标准。当您在互联网上旅行并在此站点或该站点输入您的姓名时,其中有多少人有一个完整名称的单个文本字段?我无法想到,尽管我还没有跟踪。
即使这样做,搜索名字也很麻烦。我觉得有用的一种方法是为Last_Name
添加一个名为Last_Name_Searchable
的重复字段。它包含Last_Name
的内容,但删除了所有非字母字符,其余部分转换为所有大写或小写。因此Van der Snord-Griggel
变为VANDERSNORDGRIGGEL
。然后,即使懒惰用户输入van der snordgriggle
或任何其他变体(只要拼写正确),我们也可以找到该名称。
一种变体是规范化单独表格中的变体列表。在上面的示例中,可能会有VANDERSNORDGRIGGEL
,DERSNORDGRIGGEL
,VANSNORDGRIGGEL
,SNORDGRIGGEL
,VANDERSNORD
等条目。我从未真正实现过这种技术,因为它需要付出很多努力才能保持其有用性。但是对于批量系统,您只能闪现Name not found
错误并让用户再试一次,这可能很有用。
答案 1 :(得分:0)
不是很优雅,可能效率不高。让我们看看是否有人有更好的主意。
假设您的@fullname等于“Mary Jo May”
SELECT
PersonId,
FirstName,
SecondName,
LastName
FROM Person
WHERE FirstName + ' ' + SecondName + ' ' + LastName = @fullname
还存在缺少SecondName可能性的问题。在这种情况下,字段的串联可能是错误的,因为你得到两个没有SecondName连接的空格