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는 세 가지 유형을 모두 지원합니다. 실제로 모든 시스템 저장 프로 시저와 스크립팅 된 뷰를 추출한 경우 Microsoft가 사용하는 세 가지 인스턴스를 모두 찾을 수 있습니다.
RBarryYoung

이 변경 복사본을 만들고 열 데이터를 붙여 넣으려면 텍스트 끝에 두 개의 공백이있는 커서를 갖기 전에 b / c에서 작동했습니다. 이 변경 작업을 수행 한 후 메모장에 복사하여 붙여 넣으면 커서가 텍스트의 끝에 직접있게됩니다. 프론트 엔드 GUI에서 새 줄 문자가 표시되는 문제가 발생했습니다.
natur3

8
열 데이터 유형이 텍스트 인 경우 먼저 nvarchar로 캐스트 한 다음 SELECT REPLACE (REPLACE (cast (@str as nvarchar (max)), CHAR (13), ''), CHAR (10), '')를 바꿔야합니다.
akd

1
@Slint 네, 좋은 지적입니다. 실제로 클라이언트 코드에서이를 사용하려면 열 이름을 추가해야합니다. 많은 시간을 .columns[0]대신 사용하면 도망 칠 수 있습니다 .
RBarryYoung 12

2
사용중인 Oracle 버전의 경우 명령문은 CHAR이 아니라 CHR입니다. 누군가가 Oracle에서 디버깅하려고하는 경우를 대비하여. 그렇지 않으면 다른 모든 것이 적용됩니다.
세도나

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

2
이것이 내가 처음 시도한 방법이지만 모든 데이터에서 안정적으로 작동하지는 않았습니다. @RBarryYoung 바로 위에 있습니다.
Mark W Dickson

1
교체 ( ') (,) (10) CHAR을' ') (13 CHAR을 (교체 @string') : 덕분에, 난 내 경우에, 나를 위해 그 일이 조금 수정했다
user734028을

36

나는 파티에 1 년 늦었지만 매일 쿼리 및 MS-SQL 작업을하고 내장 함수 LTRIM () & RTRIM () (그리고 항상 함께 호출해야 함)에 지쳤습니다. 끝에 줄 바꿈이있는 '더러운'데이터를 포착하지 못했기 때문에 더 나은 TRIM 기능을 구현해야 할 시점이라고 결정했습니다. 동료 피드백을 환영합니다!

면책 조항 :이 실제로 제거 가 내 원래의 대답에서 "CleanAndTrim"로 이름이 변경되었습니다 그래서, (하나의 공백을 대체합니다) 확장 공백의 양식 (탭, 줄 바꿈, 캐리지 리턴 등). 여기서 아이디어는 문자열에 여분의 특수 공백 문자 가 필요 하지 않기 때문에 머리 / 꼬리에 나타나지 않으면 일반 공백으로 바꿔야한다는 것입니다. 이러한 문자를 의도적으로 문자열에 저장 한 경우 (예 :이 열을 실행하려는 데이터 열) IT를 수행하지 마십시오! 이 함수를 개선하거나 문자를 '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

건배!

다른 면책 조항 : 일반적인 Windows 줄 바꿈은 CR + LF이므로 문자열에 해당 줄이 있으면 "double"공백으로 바꾸십시오.

업데이트, 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

1
새로운 업데이트! 테스트 사례는 여기에서 찾을 수 있습니다 : sqlfiddle.com/#!6/585a2/1/0-SQLFiddle 은 실제 테스트 사례 실행에서 질식하는 것처럼 보였으므로 대신 "테스트 사례 쿼리 작성기"테이블을 작성했습니다. 그리고 당신이 실행할 SSMS 창에 복사하여 붙여 넣을 9 개의 문장을 제공하십시오 (물론 스키마를 생성 한 후, 함수 및 TestStrings 테이블).
NateJ

32

T-SQL의 줄 바꿈은 CHAR (13) 및 CHAR (10) (캐리지 리턴 + 줄 바꿈)로 표시됩니다. 따라서 개행을 바꿀 텍스트로 REPLACE 문을 작성할 수 있습니다.

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

9
이것은 받아 들인 대답과 완전히 다릅니다. 승인 된 답변은 {13, 10}의 조합을 제거합니다. 이렇게하면 13과 10의 특정 조합 만 제거됩니다. Windows 줄 끝 부분에 차이가 없지만 다른 인코딩은 여기에서 누락됩니다.
Andrew Hill

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

열 데이터 유형이 ' text '인 경우 다음과 같은 오류 메시지가 표시됩니다.

메시지 8116, 수준 16, 상태 1, 줄 2 인수 데이터 형식 텍스트가 바꾸기 함수의 인수 1에 유효하지 않습니다.

이 경우 텍스트를 nvarchar로 캐스팅 한 다음 교체해야합니다.

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

좋아, 이거 좋아 보인다. 이제 교체하려고하는 것이 "! crlf"이고 그렇다면 그것은! crlf 뒤에 공백 문자입니다. 걱정은 이것이 문자열 중간에 발생한다는 것입니다. SELECT REPLACE (REPLACE (cast (@str as nvarchar (MAX)), CHAR (33), CHAR (13), CHAR (10), CHAR (32), '') 또는이 내용이 잘못 작성 되었습니까? 문자열은 다음과 같습니다. 원격 공격자가 샌드 박스 보호 메커니즘을 우회하고 제작 된 웹 사이트 t를 통해 권한을 얻도록 허용합니다! 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')

플로우가 첫 번째 / 가장 왼쪽 REPLACE 문을 먼저 테스트하면 실패시 다음 REPLACE 문을 계속 테스트합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.