2010-07-12 10 views
-1

[Retrait de la question: le problème est survenu en raison de l'absence d'échappement des valeurs soumises sous forme Web. Le script ASP a supprimé les espaces non échappés causant ainsi le problème.]La requête SQL Server utilisant LIKE a rencontré des problèmes avec les espaces sous VBScript

Dans une page Web, j'essaie d'effectuer une recherche sur une table dans MS SQL Server à l'aide de VBScript. La recherche utilise une clause LIKE (avec des caractères génériques). La recherche fonctionne correctement si l'entrée n'a aucun espace. Cependant, s'il y a un espace dans l'entrée, la recherche ne retourne rien. Par exemple, si je recherche IT Department je n'ai rien, mais si je cherche Department, je reçois IT Department. D'une certaine manière, l'espace entre IT et Department cause des problèmes. Si j'exécute le script directement sur le serveur à l'aide de SQL Server Management Studio, la recherche à l'aide de IT Department renvoie les résultats corrects.

De même, si je n'utilise pas les paramètres d'espace réservé SQL mais que je place directement la chaîne de recherche, la recherche fonctionne.

Ce n'est que dans le cas où la chaîne de recherche contient un espace et utilise des espaces réservés où la recherche échoue.

Voici le code que je utilise:

Dim oCmd, OffDescParam, description, query 
description = "IT Department" 
Set oCmd = Server.CreateObject("ADODB.Command") 

OffDescParam = "%" & description & "%" 
Set objOffDescParam = _ 
    oCmd.CreateParameter("@offdesc", adChar, adParamInput, Len(OffDescParam), OffDescParam) 

query = "SELECT OfficialDescription " & _ 
     "FROM [MyDatabase].[dbo].[Organizations] " & _ 
     "WHERE (OfficialDescription LIKE ?)" & _ 
     "ORDER BY OfficialDescription" 
' If I use "WHERE (OfficialDescription LIKE '%IT Department%')" it works. 

oCmd.ActiveConnection = "some/connection/string" 
oCmd.ActiveConnection.CursorLocation = adUseClient 
oCmd.CommandType = adCmdText 
oCmd.CommandText = query 

oCmd.Parameters.Append objOffDescParam 
oCmd.Prepared = True 
Set oRst = CopyRecordSet(oCmd.Execute) 
oCmd.ActiveConnection.close 
+0

Retrait d'une question: le problème est survenu en raison de l'absence d'échappement des valeurs soumises sous forme Web. Le script ASP a supprimé les espaces non échappés, provoquant ainsi le problème. – rlandster

Répondre

0

-t-il pas besoin d'être ...

"WHERE (OfficialDescription LIKE '?')" & _ 
+0

Non. L'espace réservé (paramètre) est remplacé par la chaîne correctement citée. Voir http://support.microsoft.com/kb/200190. – rlandster

0

Votre code fonctionne pour moi (bien en fait je suis une erreur sur la ligne CopyRecordSet mais je suppose que c'est juste quelque chose à voir avec ma vbscript/version ado)

Dans Profiler je vu ce qui suit

declare @p1 int 
set @p1=1 
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%' 
select @p1 

Quand j'ai couru ce directement dans Management Studio

declare @p1 int 
exec sp_prepexec @p1 output,N'@P1 char(15)',N'SELECT blah FROM [test].[dbo].[mytable] WHERE (mycol LIKE @P1)ORDER BY mycol','%IT Department%' 
select @p1 

Je suis retourné résultats. Peut-être essayez d'utiliser votre profileur pour voir si tout est comme prévu.

0

Deux choses que vous pouvez essayer, tho il semble que vous le faites correctement:

  • ADO ou SQL Server peuvent parfois se comporter d'une manière surprenante lorsque vous utilisez adChar. Essayez d'utiliser adVarChar à la place.
  • VB's Len function retourne parfois le nombre d'octets (bien que pour une chaîne, il ne devrait pas.) Essayez de calculer manuellement la longueur de la chaîne et de passer cela à CreateParameter.
+0

J'ai essayé 'adVarChar' avec les mêmes résultats. Je ne suis pas sûr de ce que vous vouliez dire par calculer la longueur de la chaîne manuellement. De quelle façon est-il possible de calculer la longueur d'une chaîne dans VB autrement qu'avec 'Len'? – rlandster

+0

@rlandster: Vous pouvez passer '15' au lieu de' Len (OffDescParam) '. C'est long, puisque vous passez clairement une corde – Andomar