web-dev-qa-db-ja.com

SQLの改行を置き換える

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

明らか

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

ただやらない...

384
Peter

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

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
759
RBarryYoung
REPLACE(@string, CHAR(13) + CHAR(10), '')
140
Mitch Wheat

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

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

私はパーティーに1年遅れるかもしれませんが、私は毎日クエリとMS-SQLに取り組んでいます、そして私は組み込み関数LTRIM()とRTRIM()にうんざりしていました。最後に改行がある「ダーティ」なデータをキャッチしないという理由で、より良いTRIM機能を実装する時が来たと思いました。ピアからのフィードバックを歓迎します。

免責事項:これは実際には (空白、タブ、改行、キャリッジリターンなど)の拡張形式の (単一の空白に置き換えられます)を削除するので、元の "CleanAndTrim"に変更されました。ここでの考えは、あなたの文字列は必要ではありませんそのような特別な空白文字はその中に含まれていないので、もしそれらが頭/尾に現れなければ、プレーンスペースに置き換えられるべきです。このような文字を意図的に文字列に格納した場合(たとえば、これから実行しようとしているデータの列)、この機能を改善するか、文字列の端点から文字を削除するように独自に作成します。 'body'からではなく文字列。

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

-- =============================================
-- 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

乾杯!

もう1つの免責事項:あなたの典型的なWindowsの改行はCR + LFです、それであなたの文字列がそれらを含むなら、あなたは "二重"スペースでそれらを置き換えることになるでしょう。

UPDATE、2016:特別な空白文字を other に置き換えて使用することができる新しいバージョンです。これには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
31
NateJ

ほとんどの人が望むことをするために、実際の改行文字ではないプレースホルダーを作成してください。そうすれば、実際に以下の方法を組み合わせることができます。

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文字を削除したいだけで、以下のようなプレースホルダーが必要な場合は、うまく機能します。
または何か、最初のアプローチはもう少し正確です。

22
porkandcheese

列のデータ型が ' text 'の場合、エラーメッセージが表示されます。

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

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

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

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

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レポートのスペースを節約するために、それらを切り捨てました。

3
DaveX

@Crerebrusによる解決策:文字列に対するH2の場合、 "+"はサポートされていません。そう:

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

Sp_helptextを使用してオープンプロシージャを使用している場合は、新しいSQLクエリ内のすべてのテキストをコピーしてctrl + hボタンを押し、置換するには正規表現を使用してください。詳細については、画像を確認してください。 ここに画像の説明を入力してください

1
Rohan