SQL Server 2016多临时表排序与平文件输出问题求助
解决思路&实现方案
我来帮你梳理下搞定这个需求的具体步骤哈,核心是先把不同列数的临时表统一成Flat File兼容的结构,再按Policy Number分组、指定记录类型排序,最后生成符合要求的记录编号。
第一步:给每个临时表加标识,统一结构
因为四个表列数不一样没法直接UNION,咱们得先给每个表打上记录类型标签和排序权重,然后把所有表的结构对齐——也就是按照你最终Flat File的列数,把每个表的对应列填进去,多余的位置用NULL或者空字符串填充。
假设你的四个临时表分别是#POLR、#PROP、#PRP1、#SUBJ,而且每个表都有PolicyNumber列(如果没有的话,得先确保能关联到对应的Policy编号哈),代码大概是这样:
-- 先创建一个合并用的临时表,结构和最终Flat File一致 SELECT 'POLR' AS RecordType, -- 记录类型标识 1 AS SortOrder, -- 排序权重:POLR排第一 PolicyNumber, -- 这里按Flat File的列顺序,填POLR表的对应列,没有的列用NULL填充 Col1, Col2, Col3, NULL AS Col4, NULL AS Col5 -- 示例,你要换成自己的列名 INTO #CombinedAll FROM #POLR UNION ALL -- 处理PROP表,排序权重2 SELECT 'PROP' AS RecordType, 2 AS SortOrder, PolicyNumber, NULL AS Col1, ColA, ColB, ColC, NULL AS Col5 -- 对应Flat File的列位置,其他填NULL FROM #PROP UNION ALL -- 处理PRP1表,排序权重3 SELECT 'PRP1' AS RecordType, 3 AS SortOrder, PolicyNumber, NULL AS Col1, NULL AS Col2, ColX, ColY, ColZ FROM #PRP1 UNION ALL -- 处理SUBJ表,排序权重4 SELECT 'SUBJ' AS RecordType, 4 AS SortOrder, PolicyNumber, ColP, NULL AS Col2, NULL AS Col3, ColQ, ColR FROM #SUBJ
这里的关键是对齐所有表的列数和顺序,这样才能用UNION ALL把所有数据合并到一起,后续排序和编号就好办了。
第二步:按Policy分组,生成有序的记录编号
现在合并后的表已经有了统一结构,咱们就可以用ROW_NUMBER()函数,按PolicyNumber分组,组内按照咱们指定的SortOrder(也就是POLR→PROP→PRP1→SUBJ的顺序)来排序,生成连续的记录编号:
SELECT RecordType, PolicyNumber, -- 同一个Policy下,按记录类型顺序生成连续编号 ROW_NUMBER() OVER (PARTITION BY PolicyNumber ORDER BY SortOrder, RecordType) AS RecordNumber, -- 这里列出Flat File需要的所有列,和第一步的结构对应 Col1, Col2, Col3, Col4, Col5 FROM #CombinedAll -- 最终整体排序:先按Policy编号,再按记录类型顺序 ORDER BY PolicyNumber, SortOrder, RecordType
如果某个Policy下有多个同类型的记录(比如多个SUBJ),这个函数会自动给它们生成连续的编号,比如SUBJ第一条是4,第二条就是5,完全符合要求。
第三步:导出成Flat File
搞定数据之后,导出就简单了:
- 如果你用SSIS的话,直接用「Flat File Destination」组件连接上面的查询结果就行,还能设置固定长度、分隔符这些格式
- 要是用SSMS,右键查询结果→「保存结果为」,选CSV或者文本文件,再调整格式到你需要的样子就行
几个要注意的小细节
- 一定要确保四个表的
PolicyNumber数据类型一致,不然分组的时候会匹配不上 - 如果Flat File要求固定长度的列,记得用
LEFT()、RIGHT()或者STR()来调整列的长度,比如LEFT(Col1, 10)就能把列固定成10位,不够的补空格 - 要是某个Policy下没有某类记录(比如没有PRP1),也不影响,编号会自动跳过这个类型,继续往下排
内容的提问来源于stack exchange,提问作者Melinda
相关产品推荐
相关产品推荐

