2010-10-18 122 views
2

我有一个查询与其他许多在同一个库中使用的查询几乎相同......但我在SQL上粘贴了大量的复制&,以便为每个都添加相似的功能稍微不一样。下面是给我SQL分析器错误的部分。它发射在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中的语法错误吗?我的同事和我似乎无法。

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

回答

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 '%'[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 2010-10-18 16:53:10

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

我** **需要对顶部8​​场比赛要由'osm_weight'订购。你的回答没有提供对导致我的语法错误的答案,它似乎只是建议我删除违规条款。 – sholsinger 2010-10-18 16:20:50

+0

@sholsinger - 违规条款*是语法错误。如果你只需要osm_weight的前8位,为什么你要按顺序获得osm_category和osm_name? – Jamiec 2010-10-18 16:28:34

+0

@sholsinger - 查看更新的答案。 – Jamiec 2010-10-18 16:30:15