TSQL'de yeni bir satırı değiştirin


414

TSQL-string bir newline karakteri değiştirmek (veya kaldırmak) istiyorum. Herhangi bir fikir?

Bariz

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

sadece yapmayacak ...

Yanıtlar:


842

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), '')

5
@NielsBrinch Dizelerinizdeki tek satır sonu türü olduğu sürece bu iyi çalışır. Ancak SQL Server her üç türü de destekler. Aslında, sistemde saklı yordamların ve komut dosyası görünümlerinin tümünü çıkardıysanız, Microsoft'un kullandığı gibi her üçünün de örneklerini bulabilirsiniz.
RBarryYoung

Bu değişiklik kopyasını yapmadan ve sütun verisini yapıştırmadan önce imlecin metnin sonunda iki boşluk bırakacağından önce bu benim için çalıştı. Bu değişikliği yapan ve not defterine yapıştıran imleç, imlecin doğrudan metnin sonunda oturmasını sağlamıştır. Benim için yeni bir satır char görünüyordu ön uç GUI b / c için bir soruna neden oldu.
natur3

8
Sütun veri türü metinse, önce nvarchar öğesine yayınlamanız gerekir, ardından SELECT REPLACE (DEĞİŞTİR (REPLACE (cast (@str as nvarchar (max))), CHAR (13), ''), CHAR (10), '')
akd

1
@Slint Evet, iyi bir nokta. Pratik olarak, bunu istemci kodundan kullanmak için bir sütun adı eklemelisiniz. Gerçi birçok kez .columns[0]bunun yerine kullanmaktan kurtulabilirsiniz .
RBarryYoung

2
Kullanmakta olduğum Oracle sürümü için ifade CHAR değil CHR'dir. Birisi Oracle'dan hata ayıklamaya çalışıyorsa. Aksi takdirde, her şey geçerlidir.
Sedona

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

2
İlk önce denediğim yöntem buydu, ancak tüm veriler için güvenilir bir şekilde çalışmadı. @RBarryYoung hemen yukarıda.
Mark W Dickson

1
teşekkürler, bu benim için çalışmak için biraz değiştirmek zorunda kaldı, benim durumumda: yerine (REPLACE (@string, CHAR (13), ''), CHAR (10), '')
user734028

36

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

Geçmiş kullanıcılar, lütfen değişiklik ve feragatnameye dikkat edin - kullanım ve amaç hakkındaki ilk varsayımlar için özür dilerim.
NateJ

1
Yeni güncelleme! Test senaryoları burada bulunabilir: sqlfiddle.com/#!6/585a2/1/0 - SQLFiddle, test senaryolarımın gerçek çalışmasını boğmuş gibi görünüyordu, bunun yerine bir "test senaryosu sorgu oluşturucu" tablosu oluşturdum & Çalıştırmak için kendi SSMS pencerenize kopyalayıp yapıştırmanız için 9 ifade verin (elbette şemayı oluşturduktan sonra, yani işlev ve TestStrings tablosu).
NateJ

32

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')

9
bu kabul edilen cevapla tamamen aynı değildir; kabul edilen cevap {13, 10} 'un herhangi bir kombinasyonunu kaldırır. Bu yalnızca 13'ten sonra 10'un spesifik kombinasyonunu kaldırır. Windows satır sonları için bir fark yaratmaz, ancak diğer kodlama burada kaçırılır.
Andrew Hill

24

Ç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.


6

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), '')

Tamam, harika görünüyor. Şimdi, ne değiştirmeye çalışıyorum "! Crlf" ve evet bu! Crlf sonra bir boşluk karakter ise. Endişe bu ipin ortasında meydana gelir, ben ile kaçabilir miyim: SELECT REPLACE (REPLACE (cast (@str as nvarchar (MAX))), CHAR (33), CHAR (13), CHAR (10), CHAR (32), '') veya yanlış yazmış mıyım? Dize şöyle görünür: uzak saldırganların bir sanal alan koruma mekanizmasını atlamasına ve Internet Explorer ile hazırlanmış bir web sitesi aracılığıyla ayrıcalıklar kazanmasına izin verin, kelime t! şapka ... bu benim sorunum nokta
bbcompent1

3

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.


1

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


1

@Cerebrus çözümüne: Dizeler için H2 için "+" desteklenmez. Yani:

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

0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.