2017-08-22 89 views
2

我的TSQL非常生疏,我找不到我正在尋找的確切答案,或者它超出了我的頭。我有一個要求從SSIS中加載的文件名稱中刪除某些字符。我有文件名和負載做得很好,它只是從文件名/字符串中刪除某些字符。讓我們把它稱爲一個字符串。去掉字符

格式字符串:

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

例子:

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

可以這樣做?有人能指引我走向正確的方向嗎?非常感謝。

回答

1

下面是使用一個小樣本XML

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 

返回

Pos4 
YOURMYHERO 
YOURMYHERO2 
+0

你用這種方法很無措。 – scsimon

+0

我很驚訝你沒有完成這個問題。在你的衚衕上。 https://stackoverflow.com/q/45823406/6167855 – scsimon

+0

@scsimon失去interes,我有一種感覺,它會有一個「兔子洞」 –

0

如果一切是固定長度的,一貫的,它與Substring很簡單,我會用你想要的k建立一個新的字符串eep,即SUBSTRING(s,1,6)+ SUBSTRING(s,16,10)等...如果不一致,你會發現自己在做很多CHARINDEX 來找到標記,如連字符。

它笨拙,但它可以工作。

0

另一種方法LEFTRIGHTSUBSTRINGCappelletti's測試數據。

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 

退貨

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

的方法是使用parsename

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

[SQL Fiddle Demo]

+0

請注意,PARASENAME函數的object_name參數是類型'SYSNAME'被定義爲'NVARCHAR(128)'且不可爲空。 –