SQL Server 2017 veya daha yenisini kullanan herkes için
Kullanabileceğiniz TRIM yerleşik işlevi. Örneğin:
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'~';
Varsayılan davranışının TRIM
yalnızca boşlukları kaldırmak olduğunu unutmayın , bu nedenle sekmeleri ve yeni satırları da (CR + LF) kaldırmak için characters FROM
yan tümceyi belirtmeniz gerekir .
Ayrıca, örnek kodun kopyalanıp yapıştırılabilmesi ve doğru karakterlerin korunabilmesi NCHAR(0x09)
için @Test
değişkende sekme karakterleri için kullandım . Aksi takdirde, bu sayfa oluşturulduğunda sekmeler boşluklara dönüştürülür.
SQL Server 2016 veya daha eski sürüm kullanan herkes için
SQLCLR Skaler UDF veya T-SQL Inline TVF (iTVF) olarak bir işlev oluşturabilirsiniz. T-SQL Inline TVF aşağıdaki gibi olacaktır:
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
Ve aşağıdaki gibi çalıştırın:
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;
İadeler:
proof
----
~this
content~
Ve bir odasını kullanabilirler UPDATE
kullanarak 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
Başlangıçta belirtildiği gibi, SQLCLR aracılığıyla bu gerçekten kolaydır, çünkü .NET Trim()
tam olarak istediğiniz işlemi yapan bir yöntem içerir . Ya kod kendi çağırmak olabilir SqlString.Value.Trim()
, ya da sadece serbest sürümünü yükleyebilirsiniz SQL # kütüphanesinden (benim yarattığım, ancak bu fonksiyon Ücretsiz sürümünde) ve kullanım ya String_Trim (sadece boşluk yapar) veya String_TrimChars nerede her iki taraftan da kırpmak için karakterleri geçirirsiniz (tıpkı yukarıda gösterilen iTVF gibi).
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];
Ve yukarıda iTVF örnek çıktısında gösterilenle aynı dizeyi döndürür. Ancak skaler bir UDF olarak, bunu aşağıdaki gibi kullanırsınız UPDATE
:
UPDATE tbl
SET tbl.[Column] = SQL#.String_Trim(itvf.[Column])
FROM SchemaName.TableName tbl
Yukarıdakilerden biri milyonlarca sıra boyunca kullanmak için verimli olmalıdır. Satır içi TVF'ler, Multi-ifadeli TVF'lerin ve T-SQL skaler UDF'lerin aksine optimize edilebilir. Ve SQLCLR Skaler UDF'ler, IsDeterministic=true
her iki tür DataAccess'i Read
(hem Kullanıcı hem de Sistem veri erişimi için varsayılan değer) olarak ayarladıkları sürece paralel planlarda kullanılma potansiyeline sahiptir None
ve bu koşulların her ikisi de yukarıda belirtilen her iki SQLCLR fonksiyonu için de geçerlidir.
UPDATE
gibi bir sorguda kullanılmak üzere bazı işlevlerde , satırlarda bir şey kırpmak için bir karakter listesi kabul eden bir işlevle umut birçok komut dosyası dili gibi.LTRIM
RTRIM
UPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
TRIM( expression, charlist )