Per chiunque utilizzi SQL Server 2017 o versioni successive
è possibile utilizzare la funzione integrata TRIM . Per esempio:
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'~';
Si noti che il comportamento predefinito di TRIM
è di rimuovere solo gli spazi, quindi per rimuovere anche le schede e le nuove righe (CR + LF), è necessario specificare la characters FROM
clausola.
Inoltre, ho usato NCHAR(0x09)
i caratteri di tabulazione nella @Test
variabile in modo che il codice di esempio possa essere copiato e incollato e conservare i caratteri corretti. Altrimenti, le schede vengono convertite in spazi quando viene visualizzata questa pagina.
Per chiunque utilizzi SQL Server 2016 o versioni precedenti
È possibile creare una funzione, come UDF scalare SQLCLR o TVF in linea T-SQL (iTVF). Il T-SQL Inline TVF sarebbe il seguente:
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
E eseguendolo come segue:
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;
Ritorna:
proof
----
~this
content~
E puoi usarlo in un UPDATE
utilizzo 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
Come accennato all'inizio, questo è anche molto semplice tramite SQLCLR poiché .NET include un Trim()
metodo che esegue esattamente l'operazione desiderata. Puoi chiamare il tuo codice da chiamare SqlString.Value.Trim()
oppure puoi semplicemente installare la versione gratuita della libreria SQL # (che ho creato, ma questa funzione è nella versione gratuita) e utilizzare String_Trim (che fa solo uno spazio bianco) o String_TrimChars dove passi i personaggi per tagliare da entrambi i lati (proprio come l'iTFF mostrato sopra).
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];
E restituisce la stessa stringa esatta mostrata sopra nell'output di esempio iTVF. Ma essendo un UDF scalare, lo useresti come segue in un UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
Uno dei precedenti dovrebbe essere efficiente per l'utilizzo su milioni di righe. I TVF in linea sono ottimizzabili a differenza dei TVF multiistruzione e degli UDF scalari T-SQL. Inoltre, gli UDF scalari SQLCLR hanno il potenziale per essere utilizzati in piani paralleli, purché siano contrassegnati come IsDeterministic=true
e non impostino alcun tipo di DataAccess su Read
(l'impostazione predefinita per l'accesso ai dati sia dell'utente che del sistema è None
), ed entrambe le condizioni sono vero per entrambe le funzioni SQLCLR indicate sopra.
UPDATE
query comeLTRIM
/RTRIM
, qualcosa in lineaUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
con unaTRIM( expression, charlist )
funzione che accetta un elenco di caratteri da tagliare come hanno fatto molti linguaggi di scripting.