Где синтаксическая ошибка в этом SQL? - PullRequest
2 голосов
/ 18 октября 2010

У меня есть запрос, который почти такой же, как и многие другие, которые используются в той же библиотеке ... но я много копировал и вставлял 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? Кажется, я и мои коллеги не можем.

Обратите внимание, что крайне важно, чтобы я сохранил упорядочение верхних 8 записей по полю osm_weight. В частности, запрос должен: получить 8 верхних по весу, которые соответствуют категории и строка (и активны). Затем мне нужно упорядочить их по категориям, чтобы они были «сгруппированы», а затем в каждой категории они должны быть упорядочены по весу, а затем по имени.

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Вы пропускаете 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;
0 голосов
/ 18 октября 2010

Ошибка в этом разделе:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...