Sql server 拆分部分数量未知的字符串列表,并将其作为表返回

Sql server 拆分部分数量未知的字符串列表,并将其作为表返回,sql-server,Sql Server,我需要在sql中用斜杠符号解析字符串。我的价值观如下: 0041/PH 5PC0000001/WCHTKSKHDS0/D 我想在一列中有0041,在第二列中,我想在第三列中有ph5pc000001和WCHTKSKHDS0,以此类推。但是,斜杠不是常量,在某些行中斜杠更多,在某些行中斜杠更少例如:像这样 PH/HCGA/002878//HTJ/, 0004/PH 5DI0000001/LTRKARDR/M /L. 提前感谢您的帮助。像这样尝试: DECLARE @inpTbl TABLE(

我需要在sql中用斜杠符号解析字符串。我的价值观如下:

0041/PH 5PC0000001/WCHTKSKHDS0/D 
我想在一列中有0041,在第二列中,我想在第三列中有ph5pc000001和WCHTKSKHDS0,以此类推。但是,斜杠不是常量,在某些行中斜杠更多,在某些行中斜杠更少例如:像这样

PH/HCGA/002878//HTJ/, 0004/PH 5DI0000001/LTRKARDR/M /L. 
提前感谢您的帮助。

像这样尝试:

DECLARE @inpTbl TABLE(inpString VARCHAR(100));
INSERT INTO @inpTbl VALUES ('0041/PH 5PC0000001/WCHTKSKHDS0/D')
                          ,('PH/HCGA/002878//HTJ/')
                          ,('0004/PH 5DI0000001/LTRKARDR/M /L');

WITH ConvertToXMLLikeStrings AS
(
    SELECT CAST('<x>' + REPLACE(inpString,'/','</x><x>') + '</x>' AS XML) AS MyData
    FROM @inpTbl AS it
)
SELECT MyData.value('x[1]','varchar(max)') AS Val1
      ,MyData.value('x[2]','varchar(max)') AS Val2
      ,MyData.value('x[3]','varchar(max)') AS Val3
      ,MyData.value('x[4]','varchar(max)') AS Val4
      ,MyData.value('x[5]','varchar(max)') AS Val5
      ,MyData.value('x[6]','varchar(max)') AS Val6
      --add as many as you need
FROM ConvertToXMLLikeStrings;

呃,你这里有一堆乱七八糟的数据要处理。首先,您必须将这些分隔值解析为行。然后,您必须创建一个动态透视,将数据放回动态数量的列中。@SeanLange,我认为它没有那么复杂…@Shnugo实际上是这样的。您使用XML进行了拆分,但最后的列数是动态的。@SeanLange,是的,您当然是对的。由于我们不知道零件的最大数量,这可能是一个问题。但我认为,有一个最大的数字可以“硬编码”…这是伟大的工作,直到有一个Val7的需要。这就是为什么我在这里说它需要是动态的。无论如何,这得到了一个+1作为分割分隔值的可靠示例。是否有任何函数我可以用来解析,所以我不必手动输入,而是自动解析整列中的字符串?@Mr.Singh请解释您想要什么。。。在视图或内嵌TVF中打包这种方法非常容易。如果你需要帮助,请让我知道,如果问题解决了,请勾选投票柜台下方的接受检查,我有超过千行不同的字符串,我无法将所有这些字符串放在一个@inpTbl中。有没有其他方法可以使用某种循环或函数,我只需输入列名,然后输入解析字符串的函数或循环?@Mr.Singh,没有,您不必在
@inpTbl
中输入任何内容。这只是为了展示一个测试用例。您不必做更多的事情,只需从
开始;使用Convert…
(在前面设置分号),将
中的
@inpTbl
更改为实际表名,将
inpString
更改为保存这些值的列名。。。
Val1    Val2                Val3        Val4    Val5    Val6
0041    PH      5PC0000001  WCHTKSKHDS0 D       NULL    NULL
PH      HCGA                002878              HTJ 
0004    PH      5DI0000001  LTRKARDR    M       L       NULL