【问题标题】:Access/SQL Server Stored Procedure Search Query - Null valuesAccess/SQL Server 存储过程搜索查询 - 空值
【发布时间】:2020-07-22 12:33:36
【问题描述】:

我已将我的 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 中,我有一个直通查询:

执行 ZSearch

最后,在我的表单上,我有一个按钮,点击时会运行以下 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-server ms-access null


    【解决方案1】:

    你可以使用ISNULL或者你可以像这样添加where子句:

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

    【讨论】:

    • 感谢您的回复。我已将 SQL 存储过程代码修改为: Where ('@'FirstName is Null OR [First Name] LIKE '%' + '@'FirstName + '%') and ('@'Surname Is Null OR [Surname] LIKE '%' + '@'Surname + '%') 但是,当我在 Access 中单击表单上的按钮时,没有在 Surname 字段中输入任何文本,我得到了调试器,它突出显示了以下代码: Surname = [Forms]![Search]![SearchSurname] 请告诉我如何解决这个问题,非常感谢
    • @AnthonyAllsopp 现在您正在询问有关 Access 开发环境如何工作的问题。大概调试器会为您提供一些关于它为什么中断应用程序并在该行停止的信息。那么 - 是吗?如果是的话,它提供了什么信息?
    • 您好,调试器显示运行时错误 '94:无效使用 Null。当我单击调试时,它会突出显示以下行 Surname = [Forms]![Search]![SearchSurname]
    猜你喜欢
    • 2010-10-31
    • 2011-06-03
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多