Yanıtlar:
Aslında bir SQL komutunda veya kod dizesinde yeni bir satır CR, LF veya CR + LF olabilir. Hepsini elde etmek için şöyle bir şeye ihtiyacınız var:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
.columns[0]
bunun yerine kullanmaktan kurtulabilirsiniz .
REPLACE(@string, CHAR(13) + CHAR(10), '')
Partiye bir yıl geç kalmış olabilirim, ancak her gün sorgular ve MS-SQL üzerinde çalışıyorum ve LTRIM () ve RTRIM () yerleşik işlevlerinden bıktım ve her zaman bunları bir araya getirmek zorunda kaldım ve Sonunda satırsonu olan 'kirli' verileri yakalamamaya karar verdim. Akran geribildirim hoş geldiniz!
Yasal Uyarı : Bu aslında kaldırır benim orijinal cevabını "CleanAndTrim" olarak yeniden adlandırıldı oluyor böylece, (tek bir boşluk ile yerine geçer) genişletilmiş boşluk biçimlerini (sekme, satır besleme, satır başı, vs.). Buradaki fikir, dizenizin içinde böyle ekstra özel boşluk karakterlerine ihtiyaç duymamasıdır ve bu nedenle baş / kuyrukta oluşmazlarsa, düz bir boşlukla değiştirilmeleri gerekir. Bu karakterleri dizenizde kasten sakladıysanız (örneğin, bunu çalıştırmak üzere olduğunuz veri sütununuz) YAPMAYIN! Bu işlevi geliştirin veya bu karakterleri kelimenin tam anlamıyla 'gövde'den değil, dizenin uç noktalarından kaldıran kendi işlevinizi yazın.
Tamam, artık feragatname güncellendiği için kod İşte.
-- =============================================
-- 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
Şerefe!
Başka bir Feragatname : Tipik Windows satır sonu CR + LF'dir, bu nedenle dizeniz bunları içeriyorsa, bunları "çift" boşluklarla değiştirirsiniz.
GÜNCELLEME, 2016 : Bu özel beyaz boşluk karakterlerini istediğiniz diğer karakterlerledeğiştirme seçeneği sunan yeni bir sürüm! Bu, Windows CR + LF eşleştirmesi için yorumları ve geçici çözümü de içerir, yani bu özel karakter çiftini tek bir ikame ile değiştirir.
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'deki Newline, CHAR (13) ve CHAR (10) (Satır başı + Satır Besleme) ile temsil edilir. Buna göre, yeni satırı değiştirmek istediğiniz metinle bir REPLACE ifadesi oluşturabilirsiniz.
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
Çoğu insanın istediği şeyi yapmak için, gerçek bir satır sonu karakteri olmayan bir yer tutucu oluşturun. O zaman aslında şu yaklaşımları birleştirebilirsiniz:
REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')
Bu şekilde yalnızca bir kez değiştirirsiniz. Yaklaşımı:
REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')
Sadece CRLF karakterlerinden kurtulmak istiyorsanız harika çalışır, ancak böyle bir yer tutucu
veya benzeri bir şey istiyorsanız, ilk yaklaşım biraz daha doğrudur.
Sütun veri türünüz ' metin ' ise, aşağıdaki gibi bir hata mesajı alırsınız:
Msg 8116, Seviye 16, Durum 1, Satır 2 Bağımsız değişken veri türü metni, değiştir işlevinin 1. bağımsız değişkeni için geçersiz.
Bu durumda metni nvarchar olarak yayınlamanız ve sonra
SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')
Yalnızca arkadaki karakterleri kaldırmak istediğiniz bir sorununuz varsa , bunu deneyebilirsiniz:
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
Bu, bir yordamın, bu satırlar boş olsa bile sabit sayıda satır içeren bir alan oluşturduğu adreslerle ilgili bir sorunu çözdü. SSRS raporumda yer kazanmak için onları kestim.
Sp_helptext kullanarak açık yordamınız varsa, tüm metni yeni sql sorgusuna kopyalayın ve ctrl + h düğmesine basın ve değiştirmek için normal ifadeyi kullanın ve ^ \ n öğesini bul alanına değiştirin. daha fazla ayrıntı için resmi kontrol edin. resim açıklamasını buraya girin
@Cerebrus çözümüne: Dizeler için H2 için "+" desteklenmez. Yani:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
Yukarıda / daha önce yayınlanan ve CHAR (13) CHAR (10) satır başı ile değiştirildiği bildirilen cevap:
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')
Kodun bir kısmına asla ulaşmayacak ve aşağıdaki istenmeyen sonuçları döndürecektir:
'something else''something else'
Ve tek bir sonuç istenen DEĞİL:
'something else'
Bu, REPLACE betiğinin şu şekilde yeniden yazılmasını gerektirir:
REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')
Akış ilk olarak 1. / En Uzak Sol REPLACE ifadesini test ederken, başarısızlık durumunda bir sonraki REPLACE ifadesini test etmeye devam eder.