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.
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