2017-05-26 1 views
1

Je suis en train d'exécuter suivant requête SQL où il essaie de trouver des résultats qui correspond aux valeurs de COLUMN2 se terminant par abcExécution PreparedStatement avec comme clause avec caractère générique

PreparedStatement stmt = conn.prepareStatement("SELECT column1 FROM dbo.table1 WHERE column2 LIKE ?"); 
stmt.setString(1, "%" +"abc"); 

Mais il ne retourne rien, même si il y a une correspondance valeur. Cela arrive uniquement avec SQL Server. La même requête avec la base de données informix renvoie des résultats corrects. Quelqu'un a-t-il une idée de ce qui fait que cela se comporte différemment?

Est-ce dû à un problème dans la façon dont PreparedStatement crée la requête SQL pour SQL Server?

Modifier

J'ai découvert cela se produit lorsque les données dans la colonne que j'EFFECTUER etc. contiennent l'espace. Par exemple: quand la colonne contient "un mot" et si j'effectue la recherche par stmt.setString(1, "%" + "word"); il ne retournera pas un résultat correspondant mais si j'effectue la même chose pour "un mot" il retournera le résultat correspondant

+0

Étrange ... c'est peut-être le cas. Essayez ceci dans votre instruction préparée et commentez le setString(): '" SELECT column1 FROM dbo.table1 WHERE column2 LIKE '% abc'; "' et voyez ce qui se passe. Peut-être qu'il veut juste le point-virgule à la fin. – DevilsHnd

+0

@DevilsHnd, Eh bien, si je supprime le 'setString()' pour analyser la valeur, il va à l'encontre du but de prévenir les injections sql. avoir un point-virgule ne change rien – sasankad

+0

Ceci est juste pour un test rapide. Cela entrerait dans la production comme ça. – jaxad0127

Répondre

1

SQL Server accepte caractères génériques dans la clause LIKE entre les guillemets simples, comme ceci ''.

Un exemple de requête SQL:

SELECT NAME FROM VERSIONS WHERE NAME LIKE 'Upd%' 

La requête ci-dessus vous donnera des résultats sur SQL Server. Appliquer la même logique à votre code Java récupérera également les résultats de votre PreparedStatement.

PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM VERSIONS WHERE NAME LIKE ?"); 
stmt.setString(1, "Upd%"); 

J'ai testé ce code sur SQL Server 2012 et cela fonctionne pour moi. Vous devez vous assurer qu'il n'y a pas d'espaces de fin dans le littéral de recherche que vous transmettez à votre code JDBC. En guise de remarque, vous devez comprendre qu'un caractère générique % utilisé au début impose une analyse de table complète sur la table, ce qui peut détériorer les performances de votre requête. Un article good pour votre future référence.

Espérons que cela aide!

+0

cela ne fonctionne pas non plus. – sasankad

+0

Mis à jour ma réponse selon votre dernier commentaire, s'il vous plaît vérifier et mettre à jour votre code sur la question! –

+0

Merci pour la réponse. J'ai finalement découvert la raison. C'était dû au fait que les valeurs dans le domaine, que j'ai fait la recherche de joker avaient des espaces de fuite. J'aurais dû vérifier cela en premier lieu. – sasankad