这个SQL中的语法错误在哪里?

时间:2010-10-18 16:07:27

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

我的查询与在同一个库中使用的许多其他查询几乎相同...但我在SQL上进行了大量的复制和粘贴,以便为每个都添加相似的功能但略有不同。下面是给出SQL分析器错误的部分。它在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位的记录。更具体地说,查询需要:按重量排名前8位匹配类别和字符串(并且是活动的)。然后我需要按类别对它们进行排序,以便它们“分组”,然后在每个类别中我需要按重量排序,然后按名称排序。

2 个答案:

答案 0 :(得分:1)

在第一个FROM之后,您错过了SELECT *

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;

答案 1 :(得分:0)

错误在本节中:

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