Sql 选择具有匹配ID的拆分值

Sql 选择具有匹配ID的拆分值,sql,sql-server,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

因此,我有一个下表:

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),',')
id (int)  val (varchar)
    ------------
 1       4234
 1       15345
 1       1324
 1       1534
 1       1512
 2       215
 2       22867
 2       2456
 ...
产生输出:

    val (varchar)
------------
    4234
    15345
    1324
    1534
    1512
我的目标是生成如下表:

 SELECT * FROM fnSplitString ((SELECT val FROM idval WHERE id = 1),',')
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的行使用结果表。

您必须使用
交叉应用

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

不要像逗号分隔的项目(在列中)那样存储数据,这只会给您带来很多问题。规范化一个值/行是SQL方式!是的,从我们的客户导入数据时别无选择。无论如何,谢谢你的建议;]我知道你的意思,必须在别人之后清理…你甚至可以不使用UDF-fnSplitString分割CSV。我知道这很简单,但没那么简单;]我只需要去掉这里重复的val列。谢谢