web-dev-qa-db-fra.com

Remplacer une nouvelle ligne dans SQL

Je voudrais remplacer (ou supprimer) un caractère de nouvelle ligne dans une chaîne TSQL. Des idées?

L'évident

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

tout simplement pas le faire ...

384
Peter

En réalité, une nouvelle ligne dans une commande SQL ou une chaîne de script peut être un CR, LF ou CR + LF. Pour les obtenir tous, vous avez besoin de quelque chose comme ça:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
784
RBarryYoung
REPLACE(@string, CHAR(13) + CHAR(10), '')
140
Mitch Wheat

J'ai peut-être un an de retard à la fête, mais je travaille sur des requêtes et MS-SQL tous les jours, et j'en ai eu marre des fonctions intégrées LTRIM () & RTRIM () (et de devoir toujours les appeler ensemble), et de ne pas capturer les données "sales" contenant des nouvelles lignes à la fin, j’ai donc décidé qu’il était grand temps de mettre en œuvre une meilleure fonction TRIM. Je serais ravi de recevoir vos commentaires!

Disclaimer : ceci en fait supprime (remplace par un seul espace) formes étendues d'espaces (onglet, saut de ligne, chariot) etc.), il a donc été renommé "CleanAndTrim" à partir de ma réponse initiale. L'idée ici est que votre chaîne n'a pas besoin de tels caractères extra-blancs spéciaux à l'intérieur, et donc s'ils ne se produisent pas en tête/queue, ils devraient être remplacés par un espace uni. Si vous avez volontairement stocké de tels caractères dans votre chaîne (par exemple, votre colonne de données sur laquelle vous êtes sur le point de l'exécuter), NE LE FAITES PAS! Améliorez cette fonction ou écrivez la vôtre qui supprime littéralement ces caractères des extrémités de la chaîne, et non du "corps".

Bon, maintenant que le disclaimer est mis à jour, voici le code.

-- =============================================
-- 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

À votre santé!

Autre clause de non-responsabilité : Votre saut de ligne Windows typique est CR + LF. Par conséquent, si votre chaîne en contient, vous finirez par les remplacer par "double". les espaces.

UPDATE, 2016 : Une nouvelle version qui vous offre la possibilité de remplacer les caractères d'espacement spécial par autre personnages de votre choix! Ceci inclut également les commentaires et la solution de contournement pour le couplage Windows CR + LF, c’est-à-dire remplace cette paire de caractères spécifique par une seule substitution.

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
32
NateJ

La nouvelle ligne dans T-SQL est représentée par CHAR (13) & CHAR (10) (retour chariot + saut de ligne). En conséquence, vous pouvez créer une instruction REPLACE avec le texte par lequel vous souhaitez remplacer la nouvelle ligne.

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

Pour faire ce que la plupart des gens voudraient, créez un espace réservé qui ne soit pas un véritable caractère de saut de ligne. Ensuite, vous pouvez réellement combiner les approches pour:

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

De cette façon, vous ne remplacez qu'une seule fois. L'approche de:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

Fonctionne très bien si vous voulez juste vous débarrasser des caractères CRLF, mais si vous voulez un espace réservé, tel que
ou quelque chose, alors la première approche est un peu plus précise.

22
porkandcheese

Si le type de données de votre colonne est 'text', vous obtiendrez un message d'erreur

Msg 8116, Niveau 16, État 1, Ligne 2 Le texte du type de données d'argument n'est pas valide pour l'argument 1 de la fonction de remplacement.

Dans ce cas, vous devez convertir le texte en nvarchar, puis remplacer

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

Si vous avez un problème pour lequel vous souhaitez uniquement supprimer les caractères suivi, vous pouvez essayer ceci:

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

Cela a résolu un problème que j'avais avec les adresses où une procédure créait un champ avec un nombre fixe de lignes, même si ces lignes étaient vides. Pour gagner de la place dans mon rapport SSRS, je les ai coupés.

3
DaveX

Pour la solution @Cerebrus: for H2 for strings "+" n'est pas pris en charge. Alors:

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

Si vous avez une procédure ouverte d'utilisation de sp_helptext, copiez tout le texte de la nouvelle requête SQL et appuyez sur les touches ctrl + h, utilisez une expression régulière pour remplacer et mettre ^\n dans le champ de recherche, remplacer par un blanc. pour plus de détails vérifier l'image . entrez la description de l'image ici

1
Rohan