2017-09-15 3 views
1

Ich versuche, jede Zeile zu entfernen, die eine bestimmte Teilzeichenfolge Signed By: enthält.Entfernen einer ganzen Zeile, wenn nur die Anfangszeichenfolge bekannt ist

So die ursprüngliche Zeichenfolge würde wie folgt aussehen:
information on line 1 information on line 2 Signed By: John Smith information on an additional line Signed By: Jane Doe

Und nach dem Entfernen der Linien
information on line 1 information on line 2 information on an additional line

Das Problem, das ich in laufen lasse, während ich leicht Signed By: ersetzen kann ich entfernen müssen der Name danach, der eine sehr unterschiedliche Anzahl von Zeichen haben kann.

EDIT
das Problem deutlicher zu machen, all dies in einem einzigen Feld in der Datenbank enthalten ist. So würde ich das gesamte Original-Zeichenkette, wenn ich
SELECT TOP 1 NoteValue FROM Notes

Antwort

0

sagen war, kann Sie eine Split-Funktion verwenden, um die Zeichenfolge in Reihen auf char (13) oder char (10) auf der Basis zu spalten. Dann stopfen Sie es wieder zusammen mit xml.

ONLINE DEMO

declare @table table (strr varchar(4000)) 
insert into @table 
values 
('information on line 1 
Signed By: John Smith 
information on line 2 
Signed By: John Smith 
information on an additional line 
Signed By: Jane Doe') 

select 
    stuff((SELECT ' ' + x.Item 
      from @table 
      cross apply DelimitedSplit8K(strr,char(13)) x 
      where Item not like '%Signed By:%' 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

RETURNS

information on line 1 
information on line 2 
information on an additional line 

HERE IS THE SPLITTER I USE

USE [Test01] 
GO 

/****** Object: UserDefinedFunction [dbo].[DelimitedSplit8K] Script Date: 09/15/2017 9:59:16 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION [dbo].[DelimitedSplit8K] (@pString VARCHAR(8000), @pDelimiter CHAR(1)) 
--WARNING!!! DO NOT USE MAX DATA-TYPES HERE! IT WILL KILL PERFORMANCE! 

RETURNS TABLE WITH SCHEMABINDING AS 
RETURN 

/* "Inline" CTE Driven "Tally Table" produces values from 1 up to 10,000... 
enough to cover VARCHAR(8000)*/ 

    WITH E1(N) AS (
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
       SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
       ),       --10E+1 or 10 rows 
     E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
     E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front 
        -- for both a performance gain and prevention of accidental "overruns" 
       SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
       ), 
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter) 
       SELECT 1 UNION ALL 
       SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter 
       ), 
cteLen(N1,L1) AS(--==== Return start and length (for use in substring) 
       SELECT s.N1, 
         ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000) 
        FROM cteStart s 
       ) 
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found. 
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1), 
     Item  = SUBSTRING(@pString, l.N1, l.L1) 
    FROM cteLen l 
; 
GO 
0

Sie könnten versuchen,

SELECT TOP 1 
    CASE WHEN PATINDEX(NoteValue,'%Signed by%')>0 
     THEN LEFT(NoteValue, PATINDEX(NoteValue,'%Signed by%')-1) 
     ELSE NoteValue 
    END FROM Notes 
+1

Dank @Scsimon verwenden. Aber ich habe die Frage offensichtlich falsch verstanden. Ich habe nicht bemerkt, dass NoteValue tatsächlich einen mehrzeiligen Text enthält. Meine Antwort funktioniert nur in einzelnen Zeilen. – cars10m

0

Eine andere Lösung TSQL für verschönernde meine Antwort

DECLARE @document varchar(max); 
SET @document = 'information on line 1 
information on line 2 
Signed By: John Smith 
information on an additional line 
Signed By: Jane Doe'; 

DECLARE @index int =0; 
DECLARE @newLineindex int =0; 
DECLARE @ReplaceText varchar(100) = 'Signed' 
SELECT CHARINDEX(@ReplaceText, @document, @index) 

WHILE ((SELECT CHARINDEX(@ReplaceText, @document, @index)) > 0) 
BEGIN 
    SELECT @index = CHARINDEX(@ReplaceText, @document, @index); 
    SELECT @newLineindex = CHARINDEX(CHAR(13), @document, @index); 
    IF(@newLineindex >@index) 
    BEGIN 
     SET @document = REPLACE(@document, SUBSTRING (@document ,@index , (@newLineindex - @index)), '') 
    END 
    ELSE 
    BEGIN 
     SET @document = REPLACE(@document, SUBSTRING (@document ,@index , ((len(@document) - @index) +1)), '') 
    END 
    SET @index =0 
END 
SELECT @document 
Verwandte Themen