답변:
실제로 SQL 명령 또는 스크립트 문자열의 줄 바꿈은 CR, LF 또는 CR + LF 일 수 있습니다. 그것들을 모두 얻으려면 다음과 같은 것이 필요합니다.
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
.columns[0]
대신 사용하면 도망 칠 수 있습니다 .
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 보고서의 공간을 절약하기 위해 공간을 줄였습니다.
sp_helptext를 사용하여 열린 절차가있는 경우 새 SQL 쿼리의 모든 텍스트를 복사하고 ctrl + h 버튼을 누릅니다. 정규 표현식을 사용하여 찾기 필드 바꾸기에 ^ \ n을 공백으로 바꿉니다. 자세한 내용은 이미지를 확인하십시오. 여기에 이미지 설명을 입력하십시오
@Cerebrus 솔루션 : 문자열 "+"에 대한 H2는 지원되지 않습니다. 그래서:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
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 문을 계속 테스트합니다.