首页 > 解决方案 > SQL Server:将表分区为多个表

问题描述

我们可以使用分区根据一个键(多个列值)将表拆分为多个表吗?

结果集:我的存储过程中有一个临时表#results

ConId  ActNbr StageId  Qty   HoursInStage HoursPassed HourlyQty FlowedQty
------ ------ ------- ------ ------------ ----------- --------- ---------
6814     77     1     24000      24           0           NULL     NULL
6814     77     2     36000      19           5           NULL     NULL
6814     77     3     48000      15           9           NULL     NULL
6814     77     4     60000      11           13          NULL     NULL
6814     77     6     60000      24           0           NULL     NULL
6855     33     1     0          24           0           NULL     NULL
6855     33     2     15000      19           5           NULL     NULL
6855     33     3     15000      15           9           NULL     NULL
6855     33     4     15000      11           13          NULL     NULL
6855     33     6     20000      24           0           NULL     NULL
176892   10     1     0          24           0           NULL     NULL
176892   10     2     0          19           5           NULL     NULL
176892   10     3     0          15           9           NULL     NULL
176892   10     4     0          11           13          NULL     NULL
176892   10     6     0          24           0           NULL     NULL
176892   47     1     0          24           0           NULL     NULL
176892   47     2     0          19           5           NULL     NULL
176892   47     3     0          15           9           NULL     NULL
176892   47     4     0          11           13          NULL     NULL
176892   47     6     0          24           0           NULL     NULL

想要对具有相同ConId和的公共行进行分区ActNbr。并将结果行插入到一个新的临时表中。

ConId  ActNbr StageId  Qty   HoursInStage HoursPassed HourlyQty  FlowedQty
------ ------ ------- ------ ------------ ----------- ---------  ---------
6814     77     1     24000      24           0           NULL      NULL
6814     77     2     36000      19           5           NULL      NULL
6814     77     3     48000      15           9           NULL      NULL
6814     77     4     60000      11           13          NULL      NULL
6814     77     6     60000      24           0           NULL      NULL

ConId  ActNbr StageId  Qty   HoursInStage HoursPassed HourlyQty  FlowedQty
------ ------ ------- ------ ------------ ----------- ---------  ---------
6855     33     1     0          24           0           NULL      NULL
6855     33     2     15000      19           5           NULL      NULL
6855     33     3     15000      15           9           NULL      NULL
6855     33     4     15000      11           13          NULL      NULL
6855     33     6     20000      24           0           NULL      NULL

-- splits other rows same as above two tables

我曾尝试使用分区,但最终不成功。不确定我是否朝着正确的方向前进以实现我所需要的。

评论更新: 我的意思是桌子上的分区。拆分#results 表的原因是为了对单个拆分表执行一些数学运算,该拆分表在具有 24 小时的最终结果集、每个小时的每一行以及此分区表上的一些数学运算附带的 qty 列上返回。

在搜索和尝试不同的方法做数学/逻辑之后,我明白在我的案例 java 中进行进一步编码总是更好。

我已经在 java 上使用HashMap<Key,Value>. 包含两列(ConIdActNbr)的键对象和作为具有剩余列的对象列表的值。

但是问题仍然存在,是否可以基于键(由表列形成)拆分表并将此拆分记录用作常规表?

标签: sql-server

解决方案


您需要使用带有游标的动态 sql 来实现相同的目的。

DECLARE @CONID INT
DECLARE @ACTNBR INT
DECLARE DBCUR CURSOR FOR
SELECT DISTINCT ConId,  ActNbr FROM #RESULTS
OPEN DBCUR 
FETCH NEXT FROM DBCUR INTO @CONID, @ANTNBR
WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @QUERY NVARCHAR(MAX)
SET @QUERY = 'SELECT * INTO #TMP' + CAST(@CONID AS VARCHAR(10)) + '_' + CAST(@ANTNBR AS VARCHAR(10)) + ' 
                FROM (SELECT * FROM YOURTABLE WHERE CONID =' + CAST(@CONID AS VARCHAR(10)) + ' AND ANTNBR =' + CAST(@ANTNBR AS VARCHAR(10)) + ') AS D;  '

EXEC SP_EXECUTESQL @QUERY

SET @QUERY = ' SELECT * FROM #TMP' + CAST(@CONID AS VARCHAR(10)) + '_' + CAST(@ANTNBR AS VARCHAR(10)) + ';   
               DROP TABLE #TMP' + CAST(@CONID AS VARCHAR(10)) + '_' + CAST(@ANTNBR AS VARCHAR(10)) + ''   ---- you may remove this line if want to use these temp table further 

EXEC SP_EXECUTESQL @QUERY


FETCH NEXT FROM DBCUR INTO @CONID, @ACTNBR
END
CLOSE DBCUR
DEALLOCATE DBCUR

推荐阅读