Bagi siapa pun yang menggunakan SQL Server 2017 atau yang lebih baru
Anda dapat menggunakan fungsi bawaan TRIM . Sebagai contoh:
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'~';
Harap perhatikan bahwa perilaku default TRIM
adalah untuk menghapus hanya spasi, jadi untuk juga menghapus tab dan baris baru (CR + LF), Anda perlu menentukan characters FROM
klausa.
Juga, saya menggunakan NCHAR(0x09)
karakter tab dalam @Test
variabel sehingga kode contoh dapat disalin dan ditempelkan dan mempertahankan karakter yang benar. Jika tidak, tab dapat dikonversi menjadi spasi ketika halaman ini diberikan.
Untuk siapa saja yang menggunakan SQL Server 2016 atau lebih tua
Anda dapat membuat fungsi, baik sebagai SQLCLR Scalar UDF atau T-SQL Inline TVF (iTVF). T-SQL Inline TVF adalah sebagai berikut:
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
Dan menjalankannya sebagai berikut:
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;
Pengembalian:
proof
----
~this
content~
Dan Anda dapat menggunakannya dalam UPDATE
menggunakan 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
Seperti yang disebutkan di awal, ini juga sangat mudah melalui SQLCLR karena .NET mencakup Trim()
metode yang tidak persis operasi yang Anda inginkan. Anda dapat mengkodekan panggilan Anda sendiri SqlString.Value.Trim()
, atau Anda dapat menginstal versi gratis dari pustaka SQL # (yang saya buat, tetapi fungsi ini dalam versi Gratis) dan menggunakan String_Trim (yang hanya menggunakan spasi putih) atau String_TrimChars di mana Anda memasukkan karakter untuk memotong dari kedua sisi (seperti iTVF yang ditunjukkan di atas).
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];
Dan mengembalikan string yang sama persis seperti yang ditunjukkan di atas dalam contoh keluaran iTVF. Tetapi sebagai skalar UDF, Anda akan menggunakannya sebagai berikut dalam UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
Salah satu di atas harus efisien untuk digunakan di jutaan baris. TVFs inline dapat dioptimalkan seperti TVFs multi-pernyataan dan UDF skalar T-SQL. Dan, SQLCLR Scalar UDFs memiliki potensi untuk digunakan dalam rencana paralel, selama mereka ditandai sebagai IsDeterministic=true
dan tidak mengatur salah satu tipe DataAccess menjadi Read
(default untuk akses data Pengguna dan Sistem None
), dan kedua kondisi tersebut adalah berlaku untuk kedua fungsi SQLCLR yang disebutkan di atas.
UPDATE
permintaan sepertiLTRIM
/RTRIM
, sesuatu di barisUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
denganTRIM( expression, charlist )
fungsi menerima daftar karakter untuk dipangkas seperti banyak bahasa scripting miliki.update
pernyataan.Saya hanya punya masalah dengan situasi khusus ini, saya perlu menemukan dan membersihkan setiap bidang dengan spasi putih, tetapi saya menemukan 4 jenis ruang putih yang memungkinkan di bidang basis data saya (Referensi ke tabel kode ASCII):
Mungkin pertanyaan ini dapat membantu Anda.
sumber
Anda harus melewatkan contoh kedua karena LTRIM / RTRIM hanya memangkas ruang. Anda sebenarnya ingin memangkas apa yang dianggap data SQL (/ r, / t, dll). Jika Anda tahu nilai yang Anda cari, gunakan saja REPLACE untuk menggantinya. Lebih baik lagi, tulis fungsi dan panggil saja.
sumber
Jika Anda suka, gunakan fungsi elegan saya:
sumber
Menggunakan fungsi pada data besar dapat memakan waktu lama. Saya memiliki dataset 8 juta baris, fungsi menggunakan waktu lebih dari 30 menit untuk dieksekusi.
replace(replace(replace(replace(@COLUMN,CHAR(9),''),CHAR(10),''),CHAR(13),''),CHAR(32),'')
hanya butuh 5 detik. Terima kasih semuanya. Aku melihatmu @ sami.almasagedi dan @Colin 't Hartsumber