【问题标题】:Where Is the Syntax Error in this SQL?此 SQL 中的语法错误在哪里?
【发布时间】:2023-03-30 09:59:02
【问题描述】:

我的查询与同一个库中使用的许多其他查询几乎相同...但是我在 SQL 上做了很多复制和粘贴,以便为每个查询添加一些相似但略有不同的功能不同的。下面是给我 SQL Parser 错误的部分。它在Set rs = 行触发。

dim sql, rs
sql = "DECLARE @str VARCHAR(255); SELECT @str = LOWER(?);" &_
      "SELECT * ( " &_
        "SELECT TOP 8 * FROM [oca_search_model] WHERE " &_
        "[osm_isactive] = 1 AND " &_
        "LOWER([osm_category]) = LOWER(?) AND " &_
        "(LOWER([osm_keywords]) LIKE '%'+@str+'%' OR " &_
        "LOWER([osm_description]) LIKE '%'+@str+'%' OR " &_
        "LOWER([osm_name]) LIKE @str+'%') " &_
        "ORDER BY [osm_weight] DESC" &_
      ") AS T1 ORDER BY [T1].[osm_category] ASC, [osm_weight] DESC, [osm_name] ASC;"
Set rs = executeQuery(conn, sql, Array(searchString, category))

我收到的具体错误是:[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'ORDER'.我已打印出从该连接生成的 SQL,如下所示(添加了换行符):

DECLARE @str VARCHAR(255);
SELECT @str = LOWER(?);
SELECT * ( 
  SELECT TOP 8 * FROM [oca_search_model]
  WHERE [osm_isactive] = 1
  AND LOWER([osm_category]) = LOWER(?)
  AND (
    LOWER([osm_keywords]) LIKE '%'+@str+'%'
    OR LOWER([osm_description]) LIKE '%'+@str+'%'
    OR LOWER([osm_name]) LIKE @str+'%'
  )
  ORDER BY [osm_weight] DESC
) AS T1
ORDER BY [T1].[osm_category] ASC, [osm_weight] DESC, [osm_name] ASC;

我在下面添加了executeQuery函数供您参考。

Function executeQuery(ByRef connection, ByRef querytext, ByRef parameters)
  Dim cmd, i, rs
  Set cmd = Server.CreateObject("ADODB.Command")
  cmd.CommandText = querytext
  cmd.CommandType = 1
  cmd.Prepared = True
  For i = 0 To UBound(parameters)
    cmd.Parameters.Append(createVarCharInputParameter(cmd, "", parameters(i)))
  Next
  Set cmd.ActiveConnection = connection 
  Set rs = cmd.Execute()
  Set executeQuery = rs
End Function

我无权使用某些测试值直接在服务器上运行查询。但是没有LOWER([osm_category]) = LOWER(?) AND 部分的类似查询运行得很好。你能发现那个 SQL 中的语法错误吗?我和我的同事似乎做不到。

请注意,我必须保留 osm_weight 字段对前 8 条记录的排序。 更具体地说,查询需要:获取与类别和字符串(并且处于活动状态)。然后我需要按类别对它们进行排序,以便将它们“分组”,然后在每个类别中我需要它们按重量排序,然后按名称排序。

【问题讨论】:

    标签: sql-server tsql vbscript subquery syntax-error


    【解决方案1】:

    您在第一个 SELECT * 之后缺少 FROM。

    DECLARE @str VARCHAR(255);
    SELECT @str = LOWER(?);
    SELECT * FROM ( 
      SELECT TOP 8 * FROM [oca_search_model]
      WHERE [osm_isactive] = 1
      AND LOWER([osm_category]) = LOWER(?)
      AND (
        LOWER([osm_keywords]) LIKE '%'+@str+'%'
        OR LOWER([osm_description]) LIKE '%'+@str+'%'
        OR LOWER([osm_name]) LIKE @str+'%'
      )
      ORDER BY [osm_weight] DESC
    ) AS T1
    ORDER BY [T1].[osm_category] ASC, [osm_weight] DESC, [osm_name] ASC;
    

    【讨论】:

    • 天啊!我怎么会错过?!感谢 SQL Server 提供有用的错误消息!我想在所有的复制和粘贴中,我对 Ctrl+X 的操作有点过头了。
    【解决方案2】:

    错误在这个部分:

    AND (
        LOWER([osm_keywords]) LIKE '%'+@str+'%'
        OR LOWER([osm_description]) LIKE '%'+@str+'%'
        OR LOWER([osm_name]) LIKE @str+'%'
    ) ORDER BY [osm_weight] DESC
    ) AS T1
    

    AND 是 where 查询的一部分,你可以在这里使用括号,没问题。但 ORDER BY 似乎添加了一组不匹配的括号。

    这个查询应该(至少在语法上)有效:

    DECLARE @str VARCHAR(255);
    SELECT @str = LOWER(?);
    SELECT TOP 8 * FROM [oca_search_model]
    WHERE [osm_isactive] = 1
    AND LOWER([osm_category]) = LOWER(?)
    AND (
        LOWER([osm_keywords]) LIKE '%'+@str+'%'
        OR LOWER([osm_description]) LIKE '%'+@str+'%'
        OR LOWER([osm_name]) LIKE @str+'%'
    ) 
    ORDER BY [osm_weight] DESC
    

    【讨论】:

    • 我需要前 8 场比赛由osm_weight 排序。您的回答没有提供导致我的语法错误的答案,它似乎只是建议我删除有问题的子句。
    • @sholsinger - 有问题的子句 is 是语法错误。如果你只需要 osm_weight 的前 8 名,为什么你要按顺序得到 osm_category 和 osm_name?
    • 我需要按重量获得与类别和字符串匹配的前 8 名。然后我需要按类别对它们进行排序,以便将它们“分组”,然后在每个类别中我希望它们按重量排序,然后按名称排序。
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多