una stuff right quitar parte left extraer caracteres cadena sql ssis transform

right - stuff sql



SQL convierte cualquier char a cero 0 (2)

Así que estoy explorando una tabla donde encontré un par de campos que deberían ser numéricos, sin embargo, como la fuente es un archivo de Excel, las personas ya han mezclado letras, símbolos y números.

Estoy tratando de limpiar estos campos, pero puedo encontrar demasiados tipos de símbolos, así que actualmente realicé la limpieza con un par de casos como:

SELECT CASE WHEN Montant_Devise LIKE ''%Free%'' THEN ''0'' WHEN Montant_Devise LIKE '' '' THEN ''0'' WHEN Montant_Devise = '''' THEN ''0'' WHEN Montant_Devise = ''-'' THEN ''0'' ELSE CAST(COALESCE(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(Montant_Devise, ''€'', ''''), '' '', ''''), '','', ''.''))), ''0'') AS DECIMAL(20,2)) END FROM [dbo].[table_BI]

Entonces, el trato aquí es que probablemente pueda encontrar nuevos símbolos en el futuro que evitar incluir los nuevos símbolos en mi caso. Me gustaría saber cómo podría reemplazar, no importa qué símbolo o letra sea el predeterminado 0 cero.

¿Sabes chicos cómo podría hacer esto?

Gracias


Empezar con

CASE WHEN patindex(Montant_Devise ''%[^0-9]%'' > 0 ''0''

Luego haz la cadena vacía. Entonces haz tu otro.


No veo una manera de hacer esto sin una función, que va a matar en el rendimiento. Dicho esto, hay muchos por ahí. Aqui hay uno.

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000)) RETURNS VARCHAR(1000) AS BEGIN WHILE PATINDEX(''%[^0-9]%'', @strText) > 0 BEGIN SET @strText = STUFF(@strText, PATINDEX(''%[^0-9]%'', @strText), 1, ''0'') END RETURN @strText END

La ejecución

declare @table table (x varchar(64) ) insert into @table values (''332148790832473487...DFSKDJFH&#@!@#''), (''0X0C0V1234'') update t set x = dbo.RemoveNonNumericCharacters(t.x) from @table t select * from @table

DEVOLUCIONES

x 33214879083247348700000000000000000 0000001234

Alternativamente, en la función puede simplemente eliminar lo no numérico cambiando

STUFF(@strText, PATINDEX(''%[^0-9]%'', @strText), 1, ''0'')

a...

STUFF(@strText, PATINDEX(''%[^0-9]%'', @strText), 1, '''')