สำหรับทุกคนที่ใช้ SQL Server 2017 หรือใหม่กว่า
คุณสามารถใช้ฟังก์ชันในตัวของTRIM ตัวอย่างเช่น:
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'~';
โปรดทราบว่าพฤติกรรมเริ่มต้นของTRIM
คือการลบเฉพาะช่องว่างดังนั้นเพื่อที่จะลบแท็บและการขึ้นบรรทัดใหม่ (CR + LFs) คุณต้องระบุcharacters FROM
ข้อ
นอกจากนี้ฉันใช้NCHAR(0x09)
สำหรับอักขระแท็บใน@Test
ตัวแปรเพื่อให้สามารถคัดลอกและวางโค้ดตัวอย่างและเก็บอักขระที่ถูกต้องได้ มิฉะนั้นแท็บจะถูกแปลงเป็นช่องว่างเมื่อมีการแสดงผลหน้านี้
สำหรับทุกคนที่ใช้ SQL Server 2016 ขึ้นไป
คุณสามารถสร้างฟังก์ชั่นไม่ว่าจะเป็น SQLCLR Scalar UDF หรือ T-SQL Inline TVF (iTVF) T-SQL Inline TVF จะเป็นดังนี้:
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
และเรียกใช้ดังนี้:
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;
ผลตอบแทน:
proof
----
~this
content~
และคุณสามารถใช้สิ่งนั้นในการUPDATE
ใช้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
ดังที่กล่าวไว้ในตอนต้นนี่เป็นเรื่องง่ายมากผ่านทาง SQLCLR เนื่องจาก. NET มีTrim()
วิธีที่จะดำเนินการตามที่คุณต้องการอย่างแท้จริง คุณสามารถรหัสอย่างใดอย่างหนึ่งของคุณเองที่จะเรียกSqlString.Value.Trim()
หรือคุณก็สามารถติดตั้งรุ่นฟรีของSQL #ห้องสมุด (ซึ่งผมสร้างขึ้น แต่ฟังก์ชั่นนี้อยู่ในรุ่นฟรี) และการใช้งานอย่างใดอย่างหนึ่งString_Trim (ซึ่งไม่เพียงพื้นที่สีขาว) หรือString_TrimCharsที่ คุณผ่านตัวละครเพื่อตัดแต่งจากทั้งสองด้าน (เช่นเดียวกับ iTVF ที่แสดงด้านบน)
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];
และมันจะคืนค่าสตริงที่แน่นอนตามที่แสดงด้านบนในเอาต์พุตตัวอย่าง iTVF แต่เป็น UDF สเกลาร์คุณจะใช้มันดังต่อไปนี้ในUPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
อย่างใดอย่างหนึ่งข้างต้นควรมีประสิทธิภาพสำหรับการใช้ข้ามแถวนับล้าน TVFs แบบอินไลน์สามารถปรับให้เหมาะสมได้ซึ่งแตกต่างจากคำสั่ง TVFs แบบหลายคำสั่งและ UDF แบบ scalar T-SQL และ SQLCLR Scalar UDFs มีศักยภาพที่จะใช้ในแผนคู่ขนานตราบใดที่มีการทำเครื่องหมายเป็นIsDeterministic=true
และไม่ได้ตั้งค่า DataAccess เป็นประเภทใดประเภทหนึ่งRead
(ค่าเริ่มต้นสำหรับทั้งการเข้าถึงข้อมูลของผู้ใช้และระบบNone
) และเงื่อนไขทั้งสองนั้นคือ เป็นจริงสำหรับทั้งฟังก์ชัน SQLCLR ที่ระบุไว้ข้างต้น
UPDATE
แบบสอบถามเช่นLTRIM
/RTRIM
บางอย่างในบรรทัดUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
ด้วยTRIM( expression, charlist )
ฟังก์ชั่นที่ยอมรับรายการอักขระเพื่อตัดแต่ง เหมือนภาษาสคริปต์มากมาย