4

这是一个非常标准的新手问题,但我正在寻找一种专家聪明的方法来用很少的代码做到这一点。(我知道如何用程序代码和游标来做这个长手,所以我们可以跳过那部分答案。)基本上,我有一个非规范化数据集,我需要在集合处理中提取一个规范化表方式。原始数据来自 Excel,我将其作为表格附加到 MS SQL 中进行查询。单个字段(在 Excel 和 SQL 中)有一个逗号分隔的每个产品参与的部门列表。

我知道我应该对数据进行规范化,但它来自 Excel(用户这样做是不切实际的)。我知道我可以通过一个循环遍历每条记录的过程(如游标或 with 语句)来做到这一点,但对于今天可用的工具来说,这似乎是不必要的。 是否有一条语句可以在其中为这些记录提取带有“参与”字段的主键?

将源想象为:

ProductIDDepartments
 123      1,3,5,15  
 456      2,4,5,16  

我做了正常的 select * from dbo.split(CommaSepField) 但这一次只适用于一条记录(并且您不能使用表值函数提供字段的值。更不用说,您如何合并所有这些单个结果套?

统一所有结果集让我想到了公共表表达式,但我无法完全弄清楚如何(1)使用扩展字段获取主键,以及(2)如何格式化查询以使其工作。

输出当然是:

ProductIDDept
 123      1  
 123      3  
 123      5  
 123      15 
 456      2  
 456      4  
 456      5  
 456      16 

我在 StackOverflow 和 Google 中对此进行了相当多的研究,但并没有真正找到适用的答案。如果我错过了,我深表歉意。请发送链接:D。

4

1 回答 1

4

通过使用运算符加入,您实际上可以使用逗号分隔 TVF CROSS APPLY

select * from Table CROSS APPLY  dbo.split(CommaSepField)
于 2009-08-17T19:58:22.303 回答