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スカラー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スカラーUDFは、IsDeterministic=true
どちらのタイプのDataAccessにも設定されておらずRead
(ユーザーとシステムの両方のデータアクセスのデフォルトがNone
)、これらの条件が両方とも設定されている限り、並列プランで使用される可能性があります。上記の両方のSQLCLR関数に対してtrueです。
UPDATE
のようなクエリLTRIM
/RTRIM
、のラインで何かUPDATE table t SET t.column = TRIM(t.column, CONCAT(CHAR(9), CHAR(10), CHAR(13)))
を持つTRIM( expression, charlist )
文字のリストを受け入れる関数は、トリミングします多くのスクリプト言語が持っているように。