2017-08-22 5 views
2

Mein TSQL ist ziemlich rostig und ich konnte nicht die genaue Antwort finden, die ich suchte, oder es war über meinem Kopf. Ich habe die Anforderung, bestimmte Zeichen aus einem Dateinamen zu entfernen, der in SSIS geladen wird. Ich habe den Dateinamen und Ladevorgang ist gut, es ist nur einige Zeichen aus dem Dateinamen/String strippen. Lass es uns einfach eine Zeichenfolge nennen.Streifen-Zeichen

Format von string:

REPORT-date-XYZ-strip me out-XYZ-BATCH.csv 

Beispiele:

REPORT-20170725-XYZ-YOURMYHERO-XYZ-BATCH.csv 
REPORT-20170725-XYZ-YOURMYHERO2-XYZ-BATCH.csv 

dies getan werden kann? Kann mir jemand in die richtige Richtung zeigen? Danke vielmals.

Antwort

1

Hier ist eine kleine Probe mit Hilfe von XML

Beispiel

Declare @YourTable Table ([SomeCol] varchar(50)) 
Insert Into @YourTable Values 
('REPORT-20170725-XYZ-YOURMYHERO-XYZ-BATCH.csv') 
,('REPORT-20170725-XYZ-YOURMYHERO2-XYZ-BATCH.csv') 


Select Pos4 = convert(xml,'<x>'+replace([SomeCol],'-','</x><x>')+'</x>').value('/x[4]','varchar(max)') 
From @YourTable 

Returns

Pos4 
YOURMYHERO 
YOURMYHERO2 
+0

Sie sind mit dieser Methode ziemlich makellos. – scsimon

+0

Ich war überrascht, dass du diese Frage nicht auch beendet hast. Genau deine Gasse. https://stackoverflow.com/q/45823406/6167855 – scsimon

+0

@scsimon Verlorene Interessen, und ich hatte das Gefühl, es wäre ein "Rabbit Hole" –

0

Wenn alles mit fester Länge und konsistent ist, es mit Substring ziemlich einfach ist, ich würde eine neue Zeichenkette mit dem erstellen, was du k willst eeep, d. h. SUBSTRING (s, 1,6) + SUBSTRING (s, 16,10), etc ... Wenn es nicht konsistent ist, werden Sie viele CHARINDEX finden, um die Marker, wie die Bindestriche zu finden.

Es ist ungeschickt, aber es kann gemacht werden, um zu arbeiten.

0

Eine andere Methode mit LEFT und RIGHT und SUBSTRING mit Cappelletti's Testdaten.

Declare @YourTable Table ([SomeCol] varchar(50)) 
Insert Into @YourTable Values 
('REPORT-20170725-XYZ-YOURMYHERO-XYZ-BATCH.csv') 
,('REPORT-20170725-XYZ-YOURMYHERO2-XYZ-BATCH.csv') 

select 
    ReturnCol = substring(right(SomeCol,len(someCol) - len(left(SomeCol,20))),1,CHARINDEX('-',right(SomeCol,len(someCol) - len(left(SomeCol,20))))-1) 
from 
    @YourTable 

RETURNS

ReturnCol 
----------- 
YOURMYHERO 
YOURMYHERO2 
0

Ein Weg ist parsename zu verwenden:

select 
    parsename(replace(txt,'-XYZ-','.'), 3) stripedOut 
from 
    yourTable; 

[SQL Fiddle Demo]

+0

Beachten Sie, dass der 'object_name' Parameter der' PARSENAME' Funktion vom Typ ist 'SYSNAME', definiert als' NVARCHAR (128) 'und nicht NULL-fähig. –