Sql server 在SQLServer2008中解析字符

Sql server 在SQLServer2008中解析字符,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个名为txt_Full_Path的SQL列,其数据如下所示 E:/My_Users//kpa1/eOReport - VSD.mrk E:/My_Users//krishr9/Report.mrk E:/My_Users//kristc/AllPAS.mrk E:/My_Users//kukerm/v1.mrk E:/My_Users//ksnedike/abcdef.mrk 第一次出现从左向右移动的“/”后,如何获取值 所以我在一个新的列中得到这些值 kpa1 kri

我有一个名为txt_Full_Path的SQL列,其数据如下所示

E:/My_Users//kpa1/eOReport - VSD.mrk 
E:/My_Users//krishr9/Report.mrk 
E:/My_Users//kristc/AllPAS.mrk 
E:/My_Users//kukerm/v1.mrk      
E:/My_Users//ksnedike/abcdef.mrk
第一次出现从左向右移动的“/”后,如何获取值

所以我在一个新的列中得到这些值

kpa1
krishr9
kristc
kukerm
ksnedike
结果:

y                         part
------------------------  ----------
/kpa1/eOReport - VSD.mrk  kpa1
/krishr9/Report.mrk       krishr9
/kristc/AllPAS.mrk        kristc
/kukerm/v1.mrk            kukerm
/ksnedike/abcdef.mrk      ksnedike
您还可能遇到没有后续
/
字符的情况,例如
'e:/foo//bar'
-如果是这样:

SELECT y, part = SUBSTRING(y, 2, COALESCE(NULLIF(CHARINDEX('/', y, 2),0),66)-2)
FROM (SELECT y = SUBSTRING(y, CHARINDEX('//', y) + 1, 64) FROM @x) AS z;

虽然很难看,但它很管用:

SELECT SUBSTRING(YourValue, CHARINDEX('//', YourValue) + 2, 
    ABS(CHARINDEX('/', YourValue, CHARINDEX('//', YourValue) + 2) - 
        (CHARINDEX('//', YourValue) + 2)))    
FROM YourTable
编辑


在最后一部分中添加了
ABS()
函数,用于在
/
之后处理没有
/
的文件夹。它确实奏效了。我在名为txt_Full_Path的列中有2000多个值。编写UNIONALSELECT将是乏味的。有没有一种更简单的方法可以使用table变量查询我的列w/o?TIA.@Nemo,这只是设置示例数据,以演示给定问题中列出的值的输出。当然,您会接受这个查询,并用实际的表名替换
@x
,用实际的列名替换
y
。虽然不存在“坏”数据的迹象,但这并不能很好地处理
/
的第二个实例可能丢失的情况。@AaronBertrand--同意,但由于它看起来像是试图提取用户文件夹,所以我认为(危险!)格式是一致的。但是,我认为您的脚本也不能处理丢失的
/
。试试:
'E:/My\u用户//krishr9'
。我得到一个传递给子字符串函数的
无效长度参数。
错误。是的,你看到我答案中的第二个脚本了吗,以及引入它的描述性文本了吗?@Aaron——令人尴尬的是,没有,我没有:|
SELECT SUBSTRING(YourValue, CHARINDEX('//', YourValue) + 2, 
    ABS(CHARINDEX('/', YourValue, CHARINDEX('//', YourValue) + 2) - 
        (CHARINDEX('//', YourValue) + 2)))    
FROM YourTable