我有一个包含三个输入字段的搜索(为了参数,假设 LastName、Last4Ssn 和 DateOfBirth)。这三个输入字段位于动态网格中,用户可以在其中选择搜索这三个字段的一个或多个组合。例如,用户可能会根据以下表示进行搜索:
LastName Last4Ssn DateOfBirth
-------- -------- -----------
Smith NULL 1/1/1970
Smithers 1234 NULL
NULL 5678 2/2/1980
在示例中,第一行表示按 LastName 和 DateOfBirth 进行的搜索。第二个,按 LastName 和 Last4Ssn。第三个是 Last4Ssn 和 DateOfBirth。这个例子有点做作,因为现实世界的场景有四个字段。至少必须用搜索数据填写两个字段(不用担心如何验证),并且可能所有字段都已填写。
在不使用游标的情况下,如何使用每行中的给定值作为过滤器使用该数据连接到现有表?目前,我有一个游标,它遍历上表的每一行,根据具有值的列执行连接,并将找到的数据插入到临时表中。像这样的东西:
CREATE TABLE #results (
Id INT,
LastName VARCHAR (26),
Last4Ssn VARCHAR (4),
DateOfBirth DATETIME
)
DECLARE @lastName VARCHAR (26)
DECLARE @last4Ssn VARCHAR (4)
DECLARE @dateOfBirth DATETIME
DECLARE search CURSOR FOR
SELECT LastName, Last4Ssn, DateOfBirth
FROM #searchData
OPEN search
FETCH NEXT FROM search
INTO @lastName, @last4Ssn, @dateOfBirth
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #results
SELECT s.Id, s.LastName, s.Last4Ssn, s.DateOfBirth
FROM SomeTable s
WHERE Last4Ssn = ISNULL(@last4Ssn, Last4Ssn)
AND DateOfBirth = ISNULL(@dateOfBirth, DateOfBirth)
AND (
LastName = ISNULL(@lastName, LastName)
OR LastName LIKE @lastName + '%'
)
FETCH NEXT FROM search
INTO @lastName, @last4Ssn, @dateOfBirth
END
CLOSE search
DEALLOCATE search
我希望有一些方法可以避免光标使代码更具可读性。性能不是问题,因为用于搜索的表中的记录永远不会超过 5-10 条,但我认为对于不止几个,一次查询所有数据而不是一个更有效一次排。我的示例中的SomeData
表格可能非常大。