【问题标题】:SQL Server query using LIKE has problems with spaces under VBScript使用 LIKE 的 SQL Server 查询在 VBScript 下存在空格问题
【发布时间】:2010-07-12 20:55:05
【问题描述】:

[撤回问题:问题是由于未转义以 Web 表单提交的值。 ASP 脚本删除了未转义的空格,从而导致了问题。]

在网页中,我尝试使用 VBScript 对 MS SQL Server 中的表进行搜索。搜索使用LIKE 子句(带有通配符)。如果输入中没有空格,则搜索工作正常。但是,如果输入中有空格,则搜索不会返回任何内容。

例如,如果我搜索 IT Department 我什么也得不到,但如果我搜索 Department 我会得到 IT Department。不知何故,ITDepartment 之间的空格引起了麻烦。如果我使用 SQL Server Management Studio 直接针对服务器运行脚本,则使用 IT Department 的搜索会返回正确的结果。

另外,如果我不使用 SQL 占位符参数,而是直接输入搜索字符串,则搜索有效。

仅在搜索字符串包含空格并在搜索失败时使用占位符的情况下。

这是我正在使用的代码:

Dim oCmd, OffDescParam, description, query
description = "IT Department"
Set oCmd = Server.CreateObject("ADODB.Command")

OffDescParam = "%" & description & "%"
Set objOffDescParam = _
  oCmd.CreateParameter("@offdesc", adChar, adParamInput, Len(OffDescParam), OffDescParam)

query = "SELECT OfficialDescription " & _
        "FROM [MyDatabase].[dbo].[Organizations] " & _
        "WHERE (OfficialDescription LIKE ?)" & _
        "ORDER BY OfficialDescription"
' If I use "WHERE (OfficialDescription LIKE '%IT Department%')" it works.

oCmd.ActiveConnection = "some/connection/string"
oCmd.ActiveConnection.CursorLocation = adUseClient
oCmd.CommandType = adCmdText
oCmd.CommandText = query

oCmd.Parameters.Append objOffDescParam
oCmd.Prepared = True
Set oRst = CopyRecordSet(oCmd.Execute)
oCmd.ActiveConnection.close

【问题讨论】:

  • 撤回问题:问题源于未转义以 Web 表单提交的值。 ASP 脚本删除了未转义的空格,从而导致了问题。

标签: sql-server vbscript sql-like


【解决方案1】:

难道不是……

"WHERE (OfficialDescription LIKE '?')" & _

【讨论】:

【解决方案2】:

您的代码对我有用(实际上我在 CopyRecordSet 行出现错误,但我怀疑这与我的 vbscript/ado 版本有关)

在 Profiler 中我看到了以下内容

declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%'
select @p1

当我直接在 Management Studio 中运行它时

declare @p1 int
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%'
select @p1

我得到了结果。也许尝试使用分析器来查看是否一切都符合预期。

【讨论】:

    【解决方案3】:

    你可以尝试两件事,但看起来你做对了:

    • 当您使用adChar 时,ADO 或 SQL Server 有时会出现令人惊讶的行为。尝试改用adVarChar
    • VB 的Len function 有时会返回字节数(尽管对于字符串,它不应该。)尝试手动计算字符串的长度并将其传递给CreateParameter

    【讨论】:

    • 我尝试了adVarChar,结果相同。我不确定您手动计算字符串的长度是什么意思。除了Len之外,VB中还有什么方法可以计算字符串的长度?
    • @rlandster:你可以通过15 而不是Len(OffDescParam)。这是一个远射,因为你显然在传递一个字符串
    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多