如何用SQL Server多输出值函数拆分数据并关联原表ID?
如何实现字符串拆分后与原表关联的结果(解决子查询返回多行报错)
完全可以通过常规查询实现你的需求,不需要额外的存储过程或者修改现有函数,只需要调整查询的关联方式就行。
你之前的报错是因为把返回多行结果的函数放在了子查询表达式中——SQL Server不允许这种场景,因为单个表达式只能返回单个值,而你的dbo.datasplit函数会返回多行,所以触发了Msg 512的错误。
正确的做法是使用CROSS APPLY(或者OUTER APPLY,根据你的空值处理需求)来关联原表和拆分函数的结果,它会自动把原表的每一行和拆分后的多行结果进行匹配,实现“行展开”的效果:
SELECT dt.ID, ds.items AS splitted_data FROM data_table dt CROSS APPLY dbo.datasplit(dt.data, ';') ds
执行这个查询后,就能得到你期望的输出:
ID splitted_data 1 a 1 b 1 c 2 d 2 e 2 f 3 j
补充说明:
- 如果你的
data字段可能存在NULL或者空字符串的情况,CROSS APPLY会过滤掉这些原表行;如果想要保留原表的所有行(即使拆分后没有结果),可以换成OUTER APPLY。
内容的提问来源于stack exchange,提问作者david.k.
相关产品推荐
相关产品推荐

