不修改存储过程/用排序参数,基于其结果生成行号的技术问询
实现方案
你的思路完全可行——利用带IDENTITY字段的临时表就能满足需求,而且完全符合「不能使用@OrderCol参数、不能修改存储过程」的限制。具体步骤如下:
- 创建与存储过程返回结果列匹配的临时表,额外添加一个自增的
RowNum字段作为行号:
CREATE TABLE #TempResult ( RowNum INT IDENTITY(1,1) PRIMARY KEY, ColA VARCHAR(50), -- 替换为存储过程返回的实际列类型 ColB INT -- 替换为存储过程返回的实际列类型 )
- 将存储过程的执行结果插入临时表:
INSERT INTO #TempResult (ColA, ColB) EXEC TestProc @OrderCol = 'B'
此时IDENTITY字段会严格按照存储过程返回的结果顺序自动生成连续的行号,完全对应输出顺序。
- 将临时表中的数据(包含自动生成的行号)插入目标表
testRn:
INSERT INTO testRn (RowNum, ColA, ColB) SELECT RowNum, ColA, ColB FROM #TempResult
- 用完临时表后可手动删除(可选,会话结束后临时表会自动销毁):
DROP TABLE #TempResult
关键说明
- 不需要知晓存储过程内部的排序逻辑(无需依赖
@OrderCol参数),仅依赖存储过程返回的结果顺序,IDENTITY字段会自动按插入顺序赋值。 - 临时表的列结构必须和存储过程返回的结果集完全匹配(列名可不同,但数据类型、顺序、数量必须一致),否则会插入失败。
内容的提问来源于stack exchange,提问作者Eric Klaus
相关产品推荐
相关产品推荐

