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列。谢谢