2010-10-18 1 views
2

У меня есть запрос, который почти такой же, как и многие другие, которые используются в одной и той же библиотеке ... но я сделал много копий вставки на SQL, чтобы добавить функции к каждому из них, которые все похожи, но немного отличается. Ниже приведен раздел, который дает мне ошибку SQL Parser. Он стреляет по линии Set rs =.Где ошибка синтаксиса в этом SQL?

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 '%'[email protected]+'%' OR " &_ 
     "LOWER([osm_description]) LIKE '%'[email protected]+'%' 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 '%'[email protected]+'%' 
    OR LOWER([osm_description]) LIKE '%'[email protected]+'%' 
    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 по весу, соответствующие категории, и строку (и активны). Затем мне нужно заказать их по категориям, чтобы они были «сгруппированы», а затем в каждой категории мне нужно было их по весу, а затем по имени.

ответ

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 '%'[email protected]+'%' 
    OR LOWER([osm_description]) LIKE '%'[email protected]+'%' 
    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

D'oh! Как я пропустил это ?! Спасибо SQL Server за полезное сообщение об ошибке! Я предполагаю, что во всем этом копировании и вставке мне удается немного Ctrl + X. – sholsinger

0

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

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

И является частью где запроса, и вы можете использовать круглые скобки здесь, никаких проблем. Bu 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 '%'[email protected]+'%' 
    OR LOWER([osm_description]) LIKE '%'[email protected]+'%' 
    OR LOWER([osm_name]) LIKE @str+'%' 
) 
ORDER BY [osm_weight] DESC 
+0

I ** need ** для 8 лучших совпадений, которые следует заказывать 'osm_weight'. В вашем ответе не содержится ответа на то, что вызывает синтаксическую ошибку, кажется, что я просто предлагаю удалить исключающее предложение. – sholsinger

+0

@sholsinger - Оскорбительное предложение * - это синтаксическая ошибка. Если вам нужен только топ-8 от osm_weight, почему у вас есть osm_category и osm_name в порядке? – Jamiec

+0

@sholsinger - см. Обновленный ответ. – Jamiec