首页 > 解决方案 > Access/SQL Server 存储过程搜索查询 - 空值

问题描述

我已将我的 Access 数据表转移到 SQL 服务器,同时仍想将 Access 用于前端。这一切都运作良好,但此后使查询运行速度变慢。运行最慢的是搜索记录的查询。

因此,我正在将查询转换为 SQL 存储过程,并且它几乎可以工作,从我在这里获得的帮助。搜索表单目前有 2 个搜索字段(名字和姓氏),但一旦我能够解决问题,这将扩展到更多搜索字段。

我面临的问题是处理搜索字段中的空值。例如,如果用户在 firstname 字段和 surname 字段中输入文本字符串,则查询将返回正确的结果。但是,如果任一搜索字段留空。查询不起作用,您会收到错误调试消息。

SQL 存储过程:

更改程序 [dbo].[ZSearch]

@FirstName varchar(100),@Surname varchar(100)

开始

SELECT [First name], [Surname] FROM [Names] where ([First Name] LIKE '%' + @FirstName + '%') 和 ([Surname] LIKE '%' + @Surname + '%')

结尾

然后在 Access 中,我有一个直通查询,即:

执行 Z 搜索

然后最后,在我的表单上,我有一个按钮,单击时运行以下 VB:

Private Sub Command4_Click() Dim rst As DAO.Recordset

Dim Firstname As String
Dim Surname As String

Firstname = [Forms]![Search]![SearchFirstName]
Surname = [Forms]![Search]![SearchSurname]
   
With CurrentDb.QueryDefs("qryPassR")
    .SQL = "EXEC ZSearch " & Firstname & ", " & Surname 'Debug.Print .SQL
    Set rst = .OpenRecordset()
    DoCmd.OpenQuery "qryPassR" End With End Sub

请有人可以帮助我处理搜索字段中的空值。我认为需要说明的是,如果搜索字段为空,则将其视为通配符,如果不为空,则使用其中的内容。

非常感谢

标签: sql-serverms-accessnull

解决方案


您可以使用ISNULL或添加 where 子句,如下所示:

-- WHERE ([First Name] LIKE '%' + ISNULL(@FirstName, '') + '%')
WHERE (@FirstName IS NULL OR [First Name] LIKE '%' + @FirstName + '%')

推荐阅读