TSQL - 将分隔的字符串拆分为列

时间:2018-04-16 19:56:09

标签: sql-server sql-server-2008 ssis ssis-2008

问题

我有许多文件名字符串,我想使用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语句中尝试大部分工作

3 个答案:

答案 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