TSQLの改行を置き換える


414

TSQL文字列の改行文字を置換(または削除)したいと思います。何か案は?

明白な

REPLACE(@string, CHAR(13), '')

やらないだけ...

回答:


843

実際には、SQLコマンドまたはスクリプト文字列の改行は、CR、LF、またはCR + LFのいずれかになります。それらをすべて取得するには、次のようなものが必要です。

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

5
@NielsBrinchそれがあなたの文字列の改行の唯一のタイプである限り、それはうまくいきます。しかし、SQL Serverは3つのタイプすべてをサポートしています。実際、システムストアドプロシージャとスクリプトビューのすべてを抽出したことがあれば、Microsoft自身が使用している3つすべてのインスタンスを見つけることができます。
RBarryYoung

これは私がこの変更コピーを作成する前にうまくいきました。列データを貼り付けると、カーソルがテキストの最後に2つのスペースで配置されます。この変更を行った後、メモ帳にコピーアンドペーストすると、カーソルがテキストの最後に直接置かれました。フロントエンドのGUIで問題が発生し、改行文字が表示されていました。
natur3 2015年

8
列のデータ型がテキストの場合、最初にnvarcharにキャストしてから、SELECT REPLACE(REPLACE(cast(@str as nvarchar(max))、CHAR(13)、 '')、CHAR(10)、 '')を置き換える必要があります。
akd 2016年

1
@Slintはい、良い点です。実際には、クライアントコードからこれを使用するには、列名を追加する必要があります。多くの場合、.columns[0]代わりにを使用することで回避できます。
RBarryYoung

2
私が使用しているバージョンのOracleでは、ステートメントはCHARではなくCHRです。誰かがOracleからデバッグしようとしている場合に備えて。それ以外の場合は、他のすべてが適用されます。
セドナ

143
REPLACE(@string, CHAR(13) + CHAR(10), '')

2
これは最初に試した方法ですが、すべてのデータに対して確実に機能するわけではありませんでした。@RBarryYoungはそれを真上に持っています。
マークWディクソン

1
おかげで、私はこれを私のために動作するように少し変更する必要がありました、私の場合は:replace(REPLACE(@string、CHAR(13)、 '')、CHAR(10)、 '')
user734028

36

私はパーティーに1年遅れる可能性がありますが、私は毎日クエリとMS-SQLに取り組んでおり、組み込み関数LTRIM()とRTRIM()に飽きました(そして常に一緒に呼び出す必要があります)。最後に改行が含まれる「ダーティ」データをキャッチしないため、より良いTRIM機能を実装するときがきたと判断しました。仲間のフィードバックをお待ちしています!

免責事項:これは実際に、拡張された形式の空白(タブ、改行、キャリッジリターンなど)を削除する(単一の空白で置き換える)ため、元の回答から「CleanAndTrim」に名前が変更されました。ここでの考え方は、文字列にはそのような余分な特殊空白文字は必要ないため、先頭/末尾にない場合は、プレーンスペースに置き換える必要があるということです。そのような文字を文字列に意図的に格納した場合(たとえば、これを実行しようとしているデータの列)、それを実行しないでください!この関数を改善するか、「本体」からではなく、文字列のエンドポイントから文字を単に削除する独自の関数を記述します。

さて、免責事項が更新されたので、ここにコードがあります。

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

乾杯!

別の免責事項:一般的なWindowsの改行はCR + LFであるため、文字列にそれらが含まれていると、「ダブル」スペースに置き換えられてしまいます。

更新、2016:これらの特別な空白文字を選択した他の文字に置き換えるオプションを提供する新しいバージョン!これには、解説とWindows CR + LFペアの回避策も含まれます。つまり、その特定の文字ペアを単一の置換で置き換えます。

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char's from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO

過去のユーザー、変更点と免責事項に注意してください-使用法と目的に関する最初の前提についてはお詫び申し上げます。
NateJ 2015年

1
新しいアップデート!テストケースはここにあります:sqlfiddle.com /# !6/ 585a2 /1 / 0 -SQLFiddleは実際のテストケースの実行を妨げるようだったので、代わりに「テストケースクエリビルダー」テーブルを作成しました&実行するために独自のSSMSウィンドウにコピーアンドペーストする9つのステートメントを提供します(もちろんスキーマ、つまり関数とTestStringsテーブルを作成した後)。
NateJ 2016年

32

T-SQLの改行は、CHAR(13)&CHAR(10)(キャリッジリターン+ラインフィード)で表されます。したがって、改行を置き換えるテキストを含むREPLACEステートメントを作成できます。

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')

9
これは、受け入れられた回答とまったく同じではありません。受け入れられた答えは、{13、10}の任意の組み合わせを削除します。これは、13と10の特定の組み合わせのみを削除します。これは、ウィンドウの行末の相違を作成しませんが、他のエンコーディングはここでは見落とされます。
アンドリューヒル、

24

ほとんどの人が望むことを行うには、実際の改行文字ではないプレースホルダーを作成します。次に、実際に以下のアプローチを組み合わせることができます。

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

この方法では、一度だけ交換します。のアプローチ:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

CRLF文字を削除したいだけの場合はうまく機能しますが、などのプレースホルダーが
必要な場合は、最初のアプローチがもう少し正確です。


6

列のデータ型が「テキスト」の場合、次のようなエラーメッセージが表示されます。

メッセージ8116、レベル16、状態1、行2置換データの引数1の引数データ型テキストは無効です。

この場合、テキストをnvarcharとしてキャストし、次に置き換える必要があります。

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

OK、これは素晴らしいですね。さて、私が置き換えようとしているのが「!crlf」であり、はい!問題は、これが文字列の途中で発生することです。次の問題を回避できますか:SELECT REPLACE(REPLACE(cast(@str as nvarchar(MAX))、CHAR(33)、CHAR(13)、CHAR(10)、CHAR (32)、 '')またはこれが間違って記述されていますか?文字列は次のようになります:リモートの攻撃者がサンドボックス保護メカニズムをバイパスし、巧妙に細工されたWebサイトを介して特権を取得できるようにします!Internet Explorerを使用してアクセスします。単語t!帽子...それが私の問題点
bbcompent1

3

末尾の文字のみを削除したい問題がある場合は、これを試すことができます:

WHILE EXISTS
(SELECT * FROM @ReportSet WHERE
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32)
BEGIN
    UPDATE @ReportSet
    SET addr_3 = LEFT(addr_3,LEN(addr_3)-1)
    WHERE 
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32
END

これにより、アドレスが空の場合でも、プロシージャが固定数の行を含むフィールドを作成するというアドレスの問題が解決されました。SSRSレポートのスペースを節約するために、それらを削減しました。


1

sp_helptextを使用したオープンプロシージャがある場合は、新しいSQLクエリのすべてのテキストをコピーしてctrl + hボタンを押すだけです。正規表現を使用して置換し、検索フィールドに^ \ nを空白で置き換えます。詳細は画像をご確認ください。ここに画像の説明を入力してください


1

@Cerebrusソリューションへ:文字列のH2の場合、「+」はサポートされていません。そう:

REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')

0

上記/以前に投稿された、CHAR(13)CHAR(10)の改行を置き換えると報告された回答:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')コードの一部に到達することはなく、次の不要な結果を返します。

'something else''something else'

そして、シングルの望ましい結果ではありません:

'something else'

その場合、REPLACEスクリプトを次のように書き直す必要があります。

REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')

フローは最初に1番目/一番左のREPLACEステートメントをテストするので、失敗すると、次のREPLACEステートメントをテストし続けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.