Solución:
La mejor forma de conseguirlo es muy sencilla y eficaz:
SELECT 'àéêöhello!' Collate SQL_Latin1_General_CP1253_CI_AI
que genera ‘aeeohello!’
La cadena no debe ser unicode. Si tiene un nvarchar, simplemente conviértalo en varchar antes de usar la intercalación.
Aquí hay una función que responde a las necesidades del OP:
create function [dbo].[RemoveExtraChars] ( @p_OriginalString varchar(50) )
returns varchar(50) as
begin
declare @i int = 1; -- must start from 1, as SubString is 1-based
declare @OriginalString varchar(100) = @p_OriginalString Collate SQL_Latin1_General_CP1253_CI_AI;
declare @ModifiedString varchar(100) = '';
while @i <= Len(@OriginalString)
begin
if SubString(@OriginalString, @i, 1) like '[a-Z]'
begin
set @ModifiedString = @ModifiedString + SubString(@OriginalString, @i, 1);
end
set @i = @i + 1;
end
return @ModifiedString
end
Entonces, el comando:
select dbo.RemoveExtraChars('aèàç=.32s df')
salidas
aeacsdf
SELECT 'áéíóú' COLLATE Cyrillic_General_CI_AI
Esto reemplazará todos los caracteres acentuados …
resultado: aeiou
¡Espero que esto te ayude!
Permítanme aclarar algo primero: los caracteres acentuados que muestra no son en realidad Unicode (como implica una respuesta); estos son caracteres ASCII de 8 bits. Una cosa a tener en cuenta: verá caracteres como è y à simplemente porque así es como su página de códigos (la página de códigos utilizada por su sistema operativo y / o SQL Server [I’m not sure which one]) los muestra. En una página de códigos diferente, estos caracteres estarían representados por símbolos totalmente diferentes (por ejemplo, si usa una página de códigos cirílica o turca).
De todos modos, digamos que desea reemplazar estos caracteres de 8 bits con el equivalente de caracteres latino / estadounidense más cercano para su página de códigos predeterminada [I assume these are characters from some variation of a Latin character set]. Así es como abordé un problema similar (descargo de responsabilidad: esta no es una solución muy elegante, pero no se me ocurrió nada mejor en ese momento):
Cree una UDF para traducir un carácter ASCII de 8 bits a un equivalente ASCII imprimible de 7 bits, como:
CREATE FUNCTION dbo.fnCharToAscii
(
@Char AS VARCHAR
)
RETURNS
VARCHAR
AS
BEGIN
IF (@Char IS NULL)
RETURN ''
-- Process control and DEL chars.
IF (ASCII(@Char) < 32) OR (ASCII(@Char) = 127)
RETURN ''
-- Return printable 7-bit ASCII chars as is.
-- UPDATE TO DELETE NON-ALPHA CHARS.
IF (ASCII(@Char) >= 32) AND (ASCII(@Char) < 127)
RETURN @Char
-- Process 8-bit ASCII chars.
RETURN
CASE ASCII(@Char)
WHEN 128 THEN 'E'
WHEN 129 THEN '?'
WHEN 130 THEN ','
WHEN 131 THEN 'f'
WHEN 132 THEN ','
WHEN 133 THEN '.'
WHEN 134 THEN '+'
WHEN 135 THEN '+'
WHEN 136 THEN '^'
WHEN 137 THEN '%'
WHEN 138 THEN 'S'
WHEN 139 THEN '<'
WHEN 140 THEN 'C'
WHEN 141 THEN '?'
WHEN 142 THEN 'Z'
WHEN 143 THEN '?'
WHEN 144 THEN '?'
WHEN 145 THEN ''''
WHEN 146 THEN ''''
WHEN 147 THEN '"'
WHEN 148 THEN '"'
WHEN 149 THEN '-'
WHEN 150 THEN '-'
WHEN 151 THEN '-'
WHEN 152 THEN '~'
WHEN 153 THEN '?'
WHEN 154 THEN 's'
WHEN 155 THEN '>'
WHEN 156 THEN 'o'
WHEN 157 THEN '?'
WHEN 158 THEN 'z'
WHEN 159 THEN 'Y'
WHEN 160 THEN ' '
WHEN 161 THEN 'i'
WHEN 162 THEN 'c'
WHEN 163 THEN 'L'
WHEN 164 THEN '?'
WHEN 165 THEN 'Y'
WHEN 166 THEN '|'
WHEN 167 THEN '$'
WHEN 168 THEN '^'
WHEN 169 THEN 'c'
WHEN 170 THEN 'a'
WHEN 171 THEN '<'
WHEN 172 THEN '-'
WHEN 173 THEN '-'
WHEN 174 THEN 'R'
WHEN 175 THEN '-'
WHEN 176 THEN 'o'
WHEN 177 THEN '+'
WHEN 178 THEN '2'
WHEN 179 THEN '3'
WHEN 180 THEN ''''
WHEN 181 THEN 'm'
WHEN 182 THEN 'P'
WHEN 183 THEN '-'
WHEN 184 THEN ','
WHEN 185 THEN '1'
WHEN 186 THEN '0'
WHEN 187 THEN '>'
WHEN 188 THEN '?'
WHEN 189 THEN '?'
WHEN 190 THEN '?'
WHEN 191 THEN '?'
WHEN 192 THEN 'A'
WHEN 193 THEN 'A'
WHEN 194 THEN 'A'
WHEN 195 THEN 'A'
WHEN 196 THEN 'A'
WHEN 197 THEN 'A'
WHEN 198 THEN 'A'
WHEN 199 THEN 'C'
WHEN 200 THEN 'E'
WHEN 201 THEN 'E'
WHEN 202 THEN 'E'
WHEN 203 THEN 'E'
WHEN 204 THEN 'I'
WHEN 205 THEN 'I'
WHEN 206 THEN 'I'
WHEN 207 THEN 'I'
WHEN 208 THEN 'D'
WHEN 209 THEN 'N'
WHEN 210 THEN 'O'
WHEN 211 THEN 'O'
WHEN 212 THEN 'O'
WHEN 213 THEN 'O'
WHEN 214 THEN 'O'
WHEN 215 THEN 'x'
WHEN 216 THEN 'O'
WHEN 217 THEN 'U'
WHEN 218 THEN 'U'
WHEN 219 THEN 'U'
WHEN 220 THEN 'U'
WHEN 221 THEN 'Y'
WHEN 222 THEN 'b'
WHEN 223 THEN 'B'
WHEN 224 THEN 'a'
WHEN 225 THEN 'a'
WHEN 226 THEN 'a'
WHEN 227 THEN 'a'
WHEN 228 THEN 'a'
WHEN 229 THEN 'a'
WHEN 230 THEN 'a'
WHEN 231 THEN 'c'
WHEN 232 THEN 'e'
WHEN 233 THEN 'e'
WHEN 234 THEN 'e'
WHEN 235 THEN 'e'
WHEN 236 THEN 'i'
WHEN 237 THEN 'i'
WHEN 238 THEN 'i'
WHEN 239 THEN 'i'
WHEN 240 THEN 'o'
WHEN 241 THEN 'n'
WHEN 242 THEN 'o'
WHEN 243 THEN 'o'
WHEN 244 THEN 'o'
WHEN 245 THEN 'o'
WHEN 246 THEN 'o'
WHEN 247 THEN '-'
WHEN 248 THEN 'o'
WHEN 249 THEN 'u'
WHEN 250 THEN 'u'
WHEN 251 THEN 'u'
WHEN 252 THEN 'u'
WHEN 253 THEN 'y'
WHEN 254 THEN 'b'
WHEN 255 THEN 'y'
END
RETURN ''
END
El código anterior es de uso general, por lo que puede ajustar las asignaciones de caracteres para eliminar todos los caracteres no alfabéticos, por ejemplo, puede usar un código como este en la coincidencia de caracteres ASCII de 7 bits imprimibles (esto supone una intercalación que no distingue entre mayúsculas y minúsculas):
IF @Char NOT LIKE '[a-z]' RETURN ''
Para ver si su mapeo de caracteres para símbolos ASCII de 8 bits funciona correctamente, ejecute el siguiente código:
DECLARE @I INT
DECLARE @Msg VARCHAR(32)
SET @I = 128
WHILE @I < 256
BEGIN
SELECT @Msg = CAST(@I AS VARCHAR) +
': ' +
CHAR(@I) +
'=' +
dbo.fnCharToAscii(CHAR(@I))
PRINT @Msg
SET @I = @I + 1
END
Ahora puede crear una UDF para procesar una cadena:
CREATE FUNCTION dbo.fnStringToAscii
(
@Value AS VARCHAR(8000)
)
RETURNS
VARCHAR(8000)
AS
BEGIN
IF (@Value IS NULL OR DATALENGTH(@Value) = 0)
RETURN ''
DECLARE @Index INT
DECLARE @Result VARCHAR(8000)
SET @Result=""
SET @Index = 1
WHILE (@Index <= DATALENGTH(@Value))
BEGIN
SET @Result = @Result + dbo.fnCharToAscii(SUBSTRING(@Value, @Index, 1))
SET @Index = @Index + 1
END
RETURN @Result
END
GO