[tsql] TSQL에서 줄 바꿈 바꾸기

TSQL 문자열에서 줄 바꿈 문자를 바꾸거나 제거하고 싶습니다. 어떤 아이디어?

명백한

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

그냥하지 않을 것입니다 …



답변

실제로 SQL 명령 또는 스크립트 문자열의 줄 바꿈은 CR, LF 또는 CR + LF 일 수 있습니다. 그것들을 모두 얻으려면 다음과 같은 것이 필요합니다.

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


답변

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


답변

나는 파티에 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


답변

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

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


답변

대부분의 사람들이 원하는 것을하려면 실제 줄 바꿈 문자가 아닌 자리 표시자를 만듭니다. 그런 다음 실제로 다음 방법을 결합 할 수 있습니다.

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 문자를 제거하고 싶거나 자리 표시 자 등을 원한다면
첫 번째 접근 방식이 조금 더 정확합니다.


답변

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

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

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

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


답변

후행 문자 만 제거하려는 문제가있는 경우 다음을 시도하십시오.

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 보고서의 공간을 절약하기 위해 공간을 줄였습니다.