sql-server - 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>
. 包含两列(ConId
和ActNbr
)的键对象和作为具有剩余列的对象列表的值。
但是问题仍然存在,是否可以基于键(由表列形成)拆分表并将此拆分记录用作常规表?
解决方案
您需要使用带有游标的动态 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
推荐阅读
- azure - Azure AD B2C - 通过令牌中的图形 API 获取自定义属性集
- java - 无法连接到jmeter
- swift - 如何使用 XCTest for iOS 14 取消通话
- css - 页面布局的 CSS/引导程序
- ruby-on-rails - Redirect_to 最初折叠但打开折叠部分的页面的一部分?
- azure-devops - 如何终止(而不是取消)错误的 Azure Pipeline 运行、阶段、作业或任务?
- python - 在 Python 中,如何知道何时导入子模块与主模块是强制性的?
- excel - VBA:如果为空单元格,则删除每个循环
- c# - ServiceStack 将 int(以毫秒为单位的 unix 时间戳)反序列化为 DateTime
- java - java mariadb 连接找不到列