我有许多文件名字符串,我想使用tilda作为分隔符解析为列。字符串采用静态格式:
C:\My Documents\PDF
Walker
Thomas
19991226
20180416150322
.pdf
因此,完整的连接示例将类似于:
C:\My Documents\PDF\Walker~Thomas~19991226~20180416150322.pdf
我想忽略字符串中给出的文件路径和扩展名,只将以下值解析为列:
类似于:
SELECT Surname = --delimitedString[0]
FirstName = --delimitedString[1]
--etc.
我知道我需要执行几项任务才能拆分字符串,首先我需要修剪扩展名和文件路径,以便我可以返回由tildas(〜)分隔的字符串。
这对我来说是个问题,但是问题2是拆分新的分隔字符串本身,即
Walker~Thomas~19991226~20180416150322
我已经很好地阅读了这篇非常全面的question并且似乎(因为我正在使用SQL Server 2008R2),唯一的选择是使用带循环的函数或递归CTE或尝试非常使用SUBSTRING()
与charIndex()
进行混乱的尝试。
我知道如果我可以访问SQL Server 2016,我可以使用string_split
,但遗憾的是我无法升级。
我确实可以访问SSIS,但我是非常新的,因此决定在SQL语句中尝试大部分工作
答案 0 :(得分:2)
我知道你提到过,如果可能的话,我想要避免使用charindex()
选项,但我希望以一种有希望的半可读方式解决这个问题。当我在不同的行上分隔每个参数并使用缩进级别时,我发现读取这样的复杂函数有点容易。这不是最合适的外观,但它有助于提高易读性:
with string as (select 'C:\My Documents\PDF\Walker~Thomas~19991226~20180416150322.pdf' as filepath)
select
substring(
filepath,
len(filepath)-charindex('\',reverse(filepath))+2, --start location, after last '\'
len(filepath)- --length of path
(len(filepath)-charindex('\',reverse(filepath))+2)- --less characters up to last '\'
(len(filepath)-charindex('.',filepath)) --less file extention
)
from string
答案 1 :(得分:2)
这是一种没有分离器的方法,不应该太复杂......
declare @var table (filepath varchar(256))
insert into @var values
('C:\My Documents\PDF\Walker~Thomas~19991226~20180416150322.pdf')
;with string as(
select
x = right(filepath,charindex('\',reverse(filepath))-1)
from @var
)
select
SurName= substring(x,1,charindex('~',x) - 1)
,FirstName = substring(x,charindex('~',x) + 1,charindex('~',x) - 1)
from string
答案 2 :(得分:2)
弗里茨已经有了一个很好的开始,我的回答只是加在上面
with string as (select 'C:\My Documents\PDF\Walker~Thomas~19991226~20180416150322.pdf' as filepath)
, newstr as (
select
REPLACE(substring(
filepath,
len(filepath)-charindex('\',reverse(filepath))+2, --start location, after last '\'
len(filepath)- --length of path
(len(filepath)-charindex('\',reverse(filepath))+2)- --less characters up to last '\'
(len(filepath)-charindex('.',filepath)) --less file extention
) , '~', '.') as new_part
from string
)
SELECT
PARSENAME(new_part,4) as Surname,
PARSENAME(new_part,3) as [First Name],
PARSENAME(new_part,2) as [Birth Date],
PARSENAME(new_part,1) as [Document Created Datetime]
FROM newstr