2010-10-18 8 views
2

J'ai une requête qui est à peu près la même que beaucoup d'autres qui sont utilisés dans la même bibliothèque ... mais j'ai fait beaucoup de copier & coller sur le SQL pour ajouter des fonctionnalités à chacun qui sont similaires, mais légèrement différent. Juste en dessous est la section qui me donne l'erreur SQL Parser. Il tire sur la ligne Set rs =.Où est l'erreur de syntaxe dans ce 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)) 

L'erreur spécifique que je reçois est: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'ORDER'. J'ai imprimé le SQL qui est généré à partir de cette concaténation et il est comme suit (avec des sauts de ligne ajoutée):

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; 

À titre de référence, J'ai ajouté la fonction executeQuery ci-dessous.

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 

Je n'ai pas accès à exécuter la requête directement sur le serveur avec certaines valeurs de test. Mais une requête similaire sans la partie LOWER([osm_category]) = LOWER(?) AND fonctionne très bien. Pouvez-vous repérer l'erreur de syntaxe dans ce SQL? Mes collègues et moi ne pouvons pas sembler.

Veuillez noter qu'il est impératif que je conserve la commande des 8 premiers enregistrements par le champ osm_weight. Plus précisément, la requête doit: obtenir le top 8 en poids qui correspondent à la catégorie, et la chaîne (et sont actifs). Ensuite, je dois les classer par catégorie afin qu'ils soient regroupés, puis dans chaque catégorie, j'ai besoin d'eux classés par poids, puis par nom.

Répondre

1

Vous êtes absent le FROM après la première 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! Comment ça m'a manqué?! Merci SQL Server pour le message d'erreur utile! Je suppose que dans tout ce copier-coller, je parviens à Ctrl + X un peu trop. – sholsinger

0

L'erreur est dans cette section:

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 

Le fait partie de la requête où, et vous pouvez utiliser des parenthèses ici, pas de problème. Bu l'ORDER BY semble ajouter un ensemble de Parenthèses incompatibles.

Cette requête devrait (au moins syntaxiquement) travail:

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

J'ai besoin de ** ** pour les 8 premières correspondances à être commandées par 'osm_weight'. Votre réponse ne fournit pas une réponse à ce qui cause mon erreur de syntaxe, il semble simplement suggérer que je supprime la clause incriminée. – sholsinger

+0

@sholsinger - La clause offensante * est * l'erreur de syntaxe. Si vous avez juste besoin du top 8 par osm_weight, pourquoi avez-vous osm_category et osm_name dans l'ordre? – Jamiec

+0

@sholsinger - voir la mise à jour. – Jamiec