Para cualquiera que use SQL Server 2017 o más reciente
puede usar la función incorporada TRIM . Por ejemplo:
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~'
+ TRIM(NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A) FROM @Test)
+ N'~';
Tenga en cuenta que el comportamiento predeterminado de TRIM
es eliminar solo espacios, por lo que para eliminar también las pestañas y las nuevas líneas (CR + LF), debe especificar la characters FROM
cláusula.
Además, utilicé NCHAR(0x09)
los caracteres de tabulación en la @Test
variable para que el código de ejemplo se pueda copiar y pegar y retener los caracteres correctos. De lo contrario, las pestañas se convierten en espacios cuando se representa esta página.
Para cualquiera que use SQL Server 2016 o anterior
Puede crear una función, ya sea como SQLCLR Scalar UDF o T-SQL Inline TVF (iTVF). El TVF en línea T-SQL sería el siguiente:
CREATE
--ALTER
FUNCTION dbo.TrimChars(@OriginalString NVARCHAR(4000), @CharsToTrim NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
WITH cte AS
(
SELECT PATINDEX(N'%[^' + @CharsToTrim + N']%', @OriginalString) AS [FirstChar],
PATINDEX(N'%[^' + @CharsToTrim + N']%', REVERSE(@OriginalString)) AS [LastChar],
LEN(@OriginalString + N'~') - 1 AS [ActualLength]
)
SELECT cte.[ActualLength],
[FirstChar],
((cte.[ActualLength] - [LastChar]) + 1) AS [LastChar],
SUBSTRING(@OriginalString, [FirstChar],
((cte.[ActualLength] - [LastChar]) - [FirstChar] + 2)) AS [FixedString]
FROM cte;
GO
Y ejecutándolo de la siguiente manera:
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~' + tc.[FixedString] + N'~' AS [proof]
FROM dbo.TrimChars(@Test, NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) tc;
Devoluciones:
proof
----
~this
content~
Y puedes usar eso en un UPDATE
uso CROSS APPLY
:
UPDATE tbl
SET tbl.[Column] = itvf.[FixedString]
FROM SchemaName.TableName tbl
CROSS APPLY dbo.TrimChars(tbl.[Column],
NCHAR(0x09) + NCHAR(0x20) + NCHAR(0x0D) + NCHAR(0x0A)) itvf
Como se mencionó al principio, esto también es realmente fácil a través de SQLCLR ya que .NET incluye un Trim()
método que realiza exactamente la operación que desea. Puede codificar el suyo para llamar SqlString.Value.Trim()
, o simplemente puede instalar la versión gratuita de la biblioteca SQL # (que creé, pero esta función está en la versión gratuita) y usar String_Trim (que solo hace espacio en blanco) o String_TrimChars donde Usted pasa los caracteres para recortar de ambos lados (al igual que el iTVF que se muestra arriba).
DECLARE @Test NVARCHAR(4000);
SET @Test = N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + N' this
' + NCHAR(0x09) + NCHAR(0x09) + N' content' + NCHAR(0x09) + NCHAR(0x09) + N'
' + NCHAR(0x09) + N' ' + NCHAR(0x09) + NCHAR(0x09) + N' ';
SELECT N'~' + SQL#.String_Trim(@Test) + N'~' AS [proof];
Y devuelve exactamente la misma cadena que se muestra arriba en la salida de ejemplo iTVF. Pero al ser un UDF escalar, lo usaría de la siguiente manera en un UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
Cualquiera de los anteriores debe ser eficiente para usar en millones de filas. Los TVF en línea son optimizables a diferencia de los TVF de múltiples declaraciones y los UDF escalares T-SQL. Y, los UDF escalares SQLCLR tienen el potencial de ser utilizados en planes paralelos, siempre que estén marcados IsDeterministic=true
y no configuren ningún tipo de DataAccess Read
(el valor predeterminado para el acceso a datos del usuario y del sistema es None
), y ambas condiciones son verdadero para las dos funciones SQLCLR mencionadas anteriormente.
UPDATE
consulta comoLTRIM
/RTRIM
, algo en la línea deUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
unaTRIM( expression, charlist )
función que acepta una lista de caracteres para recortar como muchos lenguajes de script tienen.update
declaración.Acabo de tener un problema con esta situación particular, necesitaba encontrar y limpiar cada campo con espacios en blanco, pero encontré 4 tipos de espacios en blanco posibles en los campos de mi base de datos (Referencia a la tabla de códigos ASCII):
Quizás esta consulta te pueda ayudar.
fuente
Tendría que analizar el segundo ejemplo porque LTRIM / RTRIM solo recorta espacios. En realidad, desea recortar lo que SQL considera datos (/ r, / t, etc.). Si conoce los valores que está buscando, use REPLACE para reemplazarlos. Mejor aún, escriba una función y llámela.
fuente
Si lo desea, use mi elegante función:
fuente
Usar la función en datos grandes puede llevar mucho tiempo de ejecución. Tengo un conjunto de datos de 8 millones de filas, el uso de la función tardó más de 30 minutos en ejecutarse.
replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')
tomó solo 5 segundos Gracias a todos. Te veo @ sami.almasagedi y @Colin 't Hartfuente