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 ...
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), '')
REPLACE(@string, CHAR(13) + CHAR(10), '')
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
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')
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.
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), '')
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.
Pour la solution @Cerebrus: for H2 for strings "+" n'est pas pris en charge. Alors:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')
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