tsql - uso - update output sql server 2008
Reemplazar una nueva lĂnea en TSQL (9)
Me gustaría reemplazar (o eliminar) un carácter de nueva línea en una cadena TSQL. ¿Algunas ideas?
Lo obvio
REPLACE(@string, CHAR(13), '''')
simplemente no lo haré ...
En realidad, una nueva línea en un comando SQL o cadena de script puede ser cualquiera de CR, LF o CR + LF. Para conseguirlos todos, necesitas algo como esto:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''''), CHAR(10), '''')
La línea nueva en T-SQL está representada por CHAR (13) y CHAR (10) (retorno de carro + salto de línea). Por consiguiente, puede crear una instrucción REPLACE con el texto con el que desea reemplazar la nueva línea.
REPLACE(MyField, CHAR(13) + CHAR(10), ''something else'')
Para hacer lo que la mayoría de las personas querría, cree un marcador de posición que no sea un carácter real de corte de línea. Entonces puedes combinar los enfoques para:
REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), ''something else''), CHAR(13), ''something else''), CHAR(10), ''something else'')
De esta manera usted reemplaza una sola vez. El enfoque de:
REPLACE(REPLACE(MyField, CHAR(13), ''''), CHAR(10), '''')
Funciona muy bien si solo desea deshacerse de los caracteres CRLF, pero si desea un marcador de posición, como
O algo así, entonces el primer enfoque es un poco más preciso.
Para la solución de @Cerebrus: para H2 para cadenas "+" no está suuportado. Asi que:
REPLACE(string, CHAR(13) || CHAR(10), ''replacementString'')
Puede que llegue un año tarde a la fiesta, pero trabajo en consultas y MS-SQL todos los días, y me cansé de las funciones integradas LTRIM () y RTRIM () (y siempre tengo que reunirlas), y de no capturar datos ''sucios'' que tenían nuevas líneas al final, así que decidí que era hora de implementar una mejor función TRIM. ¡Daría la bienvenida a los comentarios de los compañeros!
Descargo de responsabilidad : esto realmente elimina (reemplaza con un solo espacio en blanco) las formas extendidas de espacio en blanco (tabulación, avance de línea, retorno de carro, etc.), por lo que ha sido renombrado como "CleanAndTrim" de mi respuesta original. La idea aquí es que su cadena no necesita caracteres de espacio en blanco especiales adicionales dentro de ella, por lo que si no aparecen en la cabeza / cola, deben reemplazarse con un espacio liso. Si guardó a propósito dichos caracteres en su cadena (por ejemplo, la columna de datos en la que está a punto de ejecutar esto), ¡NO LO HAGA! Mejore esta función o escriba la suya que, literalmente, solo elimina esos caracteres de los puntos finales de la cadena, no del "cuerpo".
Bien, ahora que se ha actualizado el descargo de responsabilidad, aquí está el código.
-- =============================================
-- 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
¡Aclamaciones!
Otro descargo de responsabilidad : su salto de línea típico de Windows es CR + LF, por lo que si su cadena contiene esos, terminará reemplazándolos con espacios "dobles".
ACTUALIZACIÓN, 2016 : ¡Una nueva versión que le da la opción de reemplazar esos caracteres de espacios en blanco especiales con otros personajes de su elección! Esto también incluye comentarios y la solución para el emparejamiento de Windows CR + LF, es decir, reemplaza ese par de caracteres específico con una sola sustitución.
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://.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
Si el tipo de datos de su columna es '' texto '', aparecerá un mensaje de error como
Msg 8116, Nivel 16, Estado 1, Línea 2 El texto del tipo de datos del argumento no es válido para el argumento 1 de la función de reemplazo.
En este caso, debe convertir el texto como nvarchar y luego reemplazar
SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''''), CHAR(10), '''')
Si tiene un problema en el que solo desea eliminar los caracteres finales , puede intentar esto:
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
Esto resolvió un problema que tuve con las direcciones donde un procedimiento creó un campo con un número fijo de líneas, incluso si esas líneas estaban vacías. Para ahorrar espacio en mi informe SSRS, los recorté.
Si tiene un procedimiento abierto con el uso de sp_helptext, simplemente copie todo el texto en la nueva consulta de SQL y presione el botón ctrl + h use la expresión regular para reemplazar y poner ^ / n en el campo de búsqueda reemplazar con en blanco. para más detalle verifica la imagen. introduzca la descripción de la imagen aquí
REPLACE(@string, CHAR(13) + CHAR(10), '''')