Comment faire pour Remplacer Plusieurs Caractères dans SQL?

Ceci est basé sur une question similaire Comment faire pour Remplacer Plusieurs Caractères dans l'Accès SQL?

J'ai écrit ce depuis sql server 2005 semble avoir une limite sur la fonction de remplacement() à 19 remplacements dans la clause where.

J'ai la tâche suivante: Besoin d'effectuer un match sur une colonne, et pour améliorer les chances d'un match de décapage de plusieurs nations unies nécessaire caractères à l'aide de replace() de la fonction

DECLARE @es NVarChar(1) SET @es = ''
DECLARE @p0 NVarChar(1) SET @p0 = '!'
DECLARE @p1 NVarChar(1) SET @p1 = '@'
---etc...

SELECT *
FROM t1,t2 
WHERE  REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) 
     = REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es)    
---etc 

Si il y a >19 REPLACE() dans la clause where, il ne fonctionne pas. Donc la solution que j'ai trouvé est de créer une fonction sql appelé trimChars dans cet exemple (excuse de départ à @22

CREATE FUNCTION [trimChars] (
@string varchar(max)
) 
RETURNS varchar(max) 
AS
BEGIN
DECLARE @es NVarChar(1) SET @es = ''
DECLARE @p22 NVarChar(1) SET @p22 = '^'
DECLARE @p23 NVarChar(1) SET @p23 = '&'
DECLARE @p24 NVarChar(1) SET @p24 = '*'
DECLARE @p25 NVarChar(1) SET @p25 = '('
DECLARE @p26 NVarChar(1) SET @p26 = '_'
DECLARE @p27 NVarChar(1) SET @p27 = ')'
DECLARE @p28 NVarChar(1) SET @p28 = '`'
DECLARE @p29 NVarChar(1) SET @p29 = '~'
DECLARE @p30 NVarChar(1) SET @p30 = '{'
DECLARE @p31 NVarChar(1) SET @p31 = '}'
DECLARE @p32 NVarChar(1) SET @p32 = ' '
DECLARE @p33 NVarChar(1) SET @p33 = '['
DECLARE @p34 NVarChar(1) SET @p34 = '?'
DECLARE @p35 NVarChar(1) SET @p35 = ']'
DECLARE @p36 NVarChar(1) SET @p36 = '\'
DECLARE @p37 NVarChar(1) SET @p37 = '|'
DECLARE @p38 NVarChar(1) SET @p38 = '<'
DECLARE @p39 NVarChar(1) SET @p39 = '>'
DECLARE @p40 NVarChar(1) SET @p40 = '@'
DECLARE @p41 NVarChar(1) SET @p41 = '-'
return   REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
@string, @p22, @es), @p23, @es), @p24, @es), @p25, @es), @p26, @es), @p27, @es), @p28, @es), @p29, @es), @p30, @es), @p31, @es), @p32, @es), @p33, @es), @p34, @es), @p35, @es), @p36, @es), @p37, @es), @p38, @es), @p39, @es), @p40, @es), @p41, @es)
END 

Cela peut ensuite être utilisé en plus de l'autre, de remplacer des chaînes

SELECT *
FROM t1,t2 
WHERE  trimChars(REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) 
= REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es))   

J'ai créé avec quelques fonctions en plus pour faire la même en remplaçant comme trimChars(trimMoreChars(

SELECT *
FROM t1,t2 
WHERE  trimChars(trimMoreChars(REPLACE(REPLACE(t1.stringkey,@p0, @es), @p1, @es) 
= REPLACE(REPLACE(t2.stringkey,@p0, @es), @p1, @es)))

Quelqu'un peut-il me donner une meilleure solution à ce problème en termes de performances et peut-être un nettoyant pour la mise en œuvre?

  • Êtes-vous en mesure de désinfecter votre entrée avant de passer à la base de données?
  • De quelle taille sont les tables t1 et t2? Est-il possible de faire le travail à l'extérieur de la base de données? Ressemble à un travail pour les expressions régulières.
InformationsquelleAutor kiev | 2009-10-16