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 + LF)도 제거하려면 characters FROM
절 을 지정해야합니다 .
또한 예제 코드를 복사하여 붙여 넣고 올바른 문자를 유지할 수 있도록 변수 NCHAR(0x09)
의 탭 문자를 사용 했습니다 @Test
. 그렇지 않으면이 페이지가 렌더링 될 때 탭이 공백으로 변환됩니다.
SQL Server 2016 이상을 사용하는 사람
SQLCLR Scalar UDF 또는 T-SQL 인라인 TVF (iTVF)로 함수를 작성할 수 있습니다. T-SQL 인라인 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
using 에서 사용할 수 있습니다 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
처음에 언급했듯이 .NET에는 Trim()
원하는 작업을 정확하게 수행 하는 메서드가 포함되어 있기 때문에 SQLCLR을 통해 쉽게 수행 할 수 있습니다. 직접 호출하도록 코드를 작성 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
위의 방법 중 하나는 수백만 행에 걸쳐 효율적이어야합니다. 인라인 TVF는 다중 문 TVF 및 T-SQL 스칼라 UDF와 달리 최적화 할 수 있습니다. 또한 SQLCLR Scalar UDF는 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)))
A를TRIM( expression, charlist )
문자의 목록을 받아들이는 기능을 자릅니다 많은 스크립팅 언어처럼.