近期接到一个需求需要将一个大的单据拆分成多个小单据,这几个小单据主信息要相同,除了单号和ID外其他都要一样,于是

我考虑了借用游标和循环来进行拆分数据,并最终实现了该方法,通过了测试,代码如下:

IF OBJECT_ID(N'tempdb..#tmpOrgList', 'U') IS NOT NULL  
  drop table #tmpOrgList

---获取所有有客户的分公司的列表
select distinct OrgID into #tmpOrgList from v_WS400TelSurveyCustDetl

--声明新建单据的ID和BillNo
declare @intBillID int=0 
declare @chvBillNO nvarchar(20)

---季度首月的第一天
declare @dtLastQtStart datetime 
---季度的年和季度
declare @intYearLastQt int
declare @intLastQt int

---自动执行时赋值当前年度和当前季度
set @dtLastQtStart=DATEADD(qq, DATEDiff(qq,1,GETDATE()), 0)
set @intYearLastQt=Year(@dtLastQtStart)
set @intLastQt=DATEPART(QQ,@dtLastQtStart)

---手动执行时重新赋值指定的年度和季度
if @Flage=1 
begin
set @intYearLastQt=@intYear
set @intLastQt=@intQt
end

---获取所有的抽查明细列表,去除重复的数据
IF OBJECT_ID(N'tempdb..#tmpSVDetlList', 'U') IS NOT NULL  
 drop table #tmpSVDetlList

select distinct 
[OrgID],[CompanyID],[DistributorID],[CompBranchID],[CustID],[CustChannelID]
,[CustName],isnull([CustContact],'') as Contacts,isnull([MobilePhone],'') as MobilePhone,
isnull([CustTel],'') as ContactPhone,
[CustAddr] as ClientAddress,[AreaID],[AreaType],[AreaName]
,[IsShow],GETDATE() as CreateTime,2 as BillerID,GETDATE() as ModifyTime 
into #tmpSVDetlList
from v_WS400TelSurveyCustDetl

declare @intOrgSVDetlCount int
declare @intOrgSVDetlPage int 
declare @intPageCount int
declare @intPage int=0

---每个分公司明细超过500条就开始拆分
set @intPageCount=500

DECLARE WS400_Cursor Cursor Local For
SELECT OrgID FROM #tmpOrgList
OPEN WS400_Cursor
DECLARE @intOrgID int
FETCH NEXT FROM WS400_Cursor INTO @intOrgID

WHILE @@FETCH_STATUS=0 
BEGIN
BEGIN TRY

---判断所属分公司数据量是否超过了500条,超过了则拆分成几条数据来插入
---先生成单个分公司的抽查数据并插入临时表中
IF OBJECT_ID(N'tempdb..#tmpOrgSVDetlList', 'U') IS NOT NULL  
drop table #tmpOrgSVDetlList 
 
select 
@intBillID as BillID,ROW_NUMBER() over (order by CompanyID asc,CustID asc) as SNO,
[OrgID],[CompanyID],[DistributorID],[CompBranchID],[CustID],[CustChannelID]
,[CustName],[Contacts],[MobilePhone],[ContactPhone],
[ClientAddress],[AreaID],[AreaType],[AreaName]
,[IsShow],GETDATE() as CreateTime,2 as BillerID,GETDATE() as ModifyTime 
into #tmpOrgSVDetlList 
from #tmpSVDetlList 
where OrgID=@intOrgID

---获取当前这个分公司的所有抽查数据的数量
select @intOrgSVDetlCount=COUNT(1) from #tmpOrgSVDetlList
set  @intOrgSVDetlPage=@intOrgSVDetlCount/@intPageCount 
set @intPage=0 
---分批循环插入
while @intPage<=@intOrgSVDetlPage 
begin
----如果明细数量刚好是分页整数倍则最后一次拆分不执行
if @intPage*@intPageCount=@intOrgSVDetlCount 
begin
continue
end
---获取ID
exec dbo.prGetIdentityNoTrans 'WS400TelSurvey',@intBillID output 
---获取BillNO
exec dbo.prGetBillNo 40001,-1,-1,-1,@chvBillNO output 
---插入主表
insert into WS400TelSurvey
(
BillID,
BillNO,
OrgID,
SVYear,
SVquarter,
CreateTime,
BillerID,
ModifyTime,
Remark
)
select @intBillID,@chvBillNO,@intOrgID,@intYearLastQt,@intLastQt,GETDATE(),2,GETDATE(),''
--插入明细表
insert into WS400TelSurveyDetl(
BillID,
SNO,
OrgID,
CompanyID,
DistributorID,
CompBranchID,
CustID,
CustChannelID,
CustName,
Contacts,
MobilePhone,
ContactPhone,
ClientAddress,
AreaID,
AreaType,
AreaName,
IsShow,
CreateTime,
BillerID,
ModifyTime
)
select 
@intBillID as [BillID],[SNO],
[OrgID],[CompanyID],[DistributorID],[CompBranchID],[CustID],[CustChannelID]
,[CustName],[Contacts],[MobilePhone],[ContactPhone],
[ClientAddress],[AreaID],[AreaType],[AreaName]
,[IsShow],GETDATE() as CreateTime,2 as BillerID,GETDATE() as ModifyTime
from #tmpOrgSVDetlList  
where OrgID=@intOrgID and SNO<=(@intPage+1)*@intPageCount 
and SNO>@intPageCount*@intPage

set @intPage=@intPage+1
end

IF OBJECT_ID(N'tempdb..#tmpOrgSVDetlList', 'U') IS NOT NULL  
drop table #tmpOrgSVDetlList

END TRY
BEGIN CATCH
print 'error'
END CATCH
FETCH NEXT FROM WS400_Cursor INTO @intOrgID 
END

CLOSE WS400_Cursor 
DEALLOCATE WS400_Cursor

IF OBJECT_ID(N'tempdb..#tmpOrgList', 'U') IS NOT NULL  
drop table #tmpOrgList 
 
IF OBJECT_ID(N'tempdb..#tmpSVDetlList', 'U') IS NOT NULL  
drop table #tmpSVDetlList

转载于:https://www.cnblogs.com/kevinGao/p/3702273.html

分享一个自动生成单据的存储过程相关推荐

  1. oracle存储过程插入自动编号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 0 then if DIsAutoCreate=1 TH ...

  2. sql server 按照日期自动生成单据编号的函数

    一.sql server 按照日期自动生成单据编号的函数,格式为##08080001,##表示打头的单据字符,然后是年月和流水编号. 二.传入的参数为单据的打头字符和生成单据的日期 三.一般的调用格式 ...

  3. oracle存储过程生成单号,Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号. 可以参考以下存储过程 CREATE OR REPLACE procedure ...

  4. 分享一个python生成ico图片程序

    分享一个python生成ico图片程序 利用python PIL 进行ico 生成,课利用web框架扩展开发出网页版本. # -*- coding: utf-8 -*- from PIL import ...

  5. 用MATLAB写一个自动生成福利彩票双色球号码的程序

    用MATLAB写一个自动生成福利彩票双色球号码的程序 规则 红色球:1-33号任选6个 蓝色球:1-16号任选1个 red = randi([1,33],1,6); disp('红色球'); fpri ...

  6. 分享一个Java生成二维码工具类

    分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...

  7. mysql 单据编号生成_mysql自动生成单据编号

    这一句SQL就可以直接生成唯一的单据编号,方便直接插入主表 select CONCAT ('test_', DATE_FORMAT(now(), '%Y%m%d'), RIGHT(CONCAT ('0 ...

  8. android studio 自动生成sql语句,Android Studio Plugin 插件开发教程(三) —— 制作一个自动生成数据库代码的插件...

    项目源码 系列教程 插件介绍 本篇实战撸个自动生成安卓Sqlite数据库代码的插件,先演示下最终效果 db文件夹下的都是插件自动生成的,而MainActivity里面的代码是我提前写好的,用于实验插件 ...

  9. 爬虫第7课课后练习-用扇贝网做一个自动生成错词本

    第一步:分析需求,明确目标 扇贝网:https://www.shanbay.com/已经有一个测单词量的功能, 我们要做的就是把这个功能复制下来,并且做点改良,搞一个网页版没有的功能 ---- 自动生 ...

最新文章

  1. solr7.6 安装配置
  2. UVa 10820 (打表、欧拉函数) Send a Table
  3. 新安江遗传算法c语言,基于遗传算法的新安江模型参数优化率定(四)
  4. oracle 控制文件在哪里设置_更改Oracle默认的控制文件设置
  5. 兼顾隐私与权利,华为以“科技有道”,实现“隐私无价”
  6. SAP Fiori SSL 和 SAML 2.0 配置文档
  7. 鬲融:从唐山走出的国际杰出青年学者
  8. 究竟什么时候该使用MQ?
  9. 生产者消费者_Kafka之生产者/消费者
  10. 嬴彻首款L3自动驾驶样车发布:自研全栈系统,满足高速全场景工况
  11. Spring Boot 之注解@Component @ConfigurationProperties(prefix = sms)
  12. 【风电功率预测】基于matlab遗传算法优化BP神经网络风电功率预测【含Matlab源码 760期】
  13. word中插入代码_如何在Word中优雅的插入公式
  14. Altium Designer使用-----快速覆铜脚本的使用
  15. c语言二级编程题库,计算机二级C语言编程题库(100题)
  16. 基于置信加权池的全卷积保证颜色恒常性
  17. 【HCIE-RS 天梯路】MSDP
  18. excel两个表格数据对比_两个excel表格核对的多种方法
  19. logmein攻防世界wp
  20. MySQL学习笔记.安全管理

热门文章

  1. mall-swarm是一套微服务商城系统
  2. ceph docker mysql_使用Docker部署单机版Ceph
  3. cookie无法读取bdstoken_Web自动化测试:对cookie的操作
  4. 最近很火的数据动图python_GitHub热榜第一,标星近万:这个用Python做交互式图形的项目火了...
  5. 最新口绑查询HTML源码
  6. 计算机教学学生创新能力,职业技术学校创新能力计算机教学论文
  7. Java快速入门学习笔记5 | Java语言中的while循环语句
  8. 计算机系统与环境,COMPUTERS ENVIRONMENT AND URBAN SYSTEMS《计算机、环境与城市系统》SSCI论文投稿_万维书刊网...
  9. Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接
  10. 学法减分小程序可用可运营源码附带安装教程