选择具有匹配ID的拆分值

时间:2016-04-27 07:46:37

标签: sql sql-server

所以我有一张下表:

id (int)  | val (varchar)
------------------------------------
1         | 4234,15345,1324,1534,1512
2         | 215,22867,2456,24756,2423
3         | 3123,3452,3356,3478,3995

另外,我有一个函数fnSplitString(string varchar(max),deliminator char(1)),它的工作原理如下:

 SELECT * FROM fnSplitString ((SELECT val FROM idval WHERE id = 1),',')

产生输出:

    val (varchar)
------------
    4234
    15345
    1324
    1534
    1512

我的目标是制作一个这样的表:

id (int)  val (varchar)
    ------------
 1       4234
 1       15345
 1       1324
 1       1534
 1       1512
 2       215
 2       22867
 2       2456
 ...

我知道如何使用游标实现它并插入临时表。我只是好奇,如果没有光标可以这样做吗?我们假设我不想首先修改fnSplitString函数。到目前为止,我已经提出了查询的一部分:

SELECT id, spl.val 
FROM idval JOIN 
(SELECT * FROM fnSplitString ((SELECT val FROM idval WHERE id = 1),',')) spl 
ON 1=1 
WHERE id = 1

只有id = 1的行才能得到结果表。

1 个答案:

答案 0 :(得分:3)

您必须使用CROSS APPLY

SELECT *
FROM idval i
CROSS APPLY dbo.fnSplitString(i.val, ',') f