У меня есть запрос, который почти такой же, как и многие другие, которые используются в одной и той же библиотеке ... но я сделал много копий вставки на 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 по весу, соответствующие категории, и строку (и активны). Затем мне нужно заказать их по категориям, чтобы они были «сгруппированы», а затем в каждой категории мне нужно было их по весу, а затем по имени.
D'oh! Как я пропустил это ?! Спасибо SQL Server за полезное сообщение об ошибке! Я предполагаю, что во всем этом копировании и вставке мне удается немного Ctrl + X. – sholsinger