有订单表Order和条码表BarCode
根据条件查询表Order的数据, 将符合条件的表Order数据写入表BarCode (一条表Order数据, 可能写入多条表BarCode,字段值不同)
我的设想
--解释一下字段的意义
--OrderID 订单编号
--Quantity 当前订单的生产数量
--BoxQuantity 当前出货箱的装箱数量
--条码数量=Quantity/BoxQuantity ,条码数量等于几,在表BarCode中就有几条记录
--查询表A, 执行自定义函数
select dbo.CreateBarCode(Order.OrderID,Order.Quantity,Box.BoxQuantity) from Order inner join Box on Order.BoxID=Box.BoxID
--生成条码的自定义函数
function CreateBarCode(@OrderID varchar,@Quantity int,@BoxQuantity int)
return bit
as
begin
declare @count int = @Quantity/@BoxQuantity;
while(@count>0)
begin
--insert into BarCode ...此处省略 新增该订单条码数据
end
end
但是SQL编译器说在自定义函数中使用insert,update 是不安全的操作。 不允许这种写法。 而我想改用存储过程。却没法在select 语句中调用。
为什么我想用function 来做这个事情?
因为自定义函数可以嵌套在select语句中使用。执行批处理操作。
select top 100 dbo.MyFuction(field1,field2) from tb
这样MyFuction这个函数就执行了100次。 写法上很方便
而存储过程没法这样嵌套在select语句中调用,调用存储过程必须要用到exec ....被语法困住 真是一件很悲催的事。
除非。。用游标循环表的结果集。。在游标循环中调用存储过程。但是基于性能问题的考虑。 游标的方式我抛弃了。
请教一下各位 有没有其他解决方案。 我暂时想不到更好的办法
------解决方案--------------------
select 后插入不行么,为啥非要写入函数里。
------解决方案--------------------
兄弟,谁说那只是处理一条数据了,你这哪是什么特殊需求啊,很常见好么。
------解决方案--------------------
建议用存储过程实现,且应该是可以实现的,
请问有什么问题?不太明白LZ无法用存储过程的原因,可否举例说明.
------解决方案--------------------
兄弟啊,select时是可以对选择的数据进行汇总的啊,别一根筋啊, 不知道你那插入的数据生成规则,没法给你写出来。不过看你问的问题,真替你着急啊。
------解决方案--------------------
看需求,你那很明显是根据查出来的基础表数据汇总后,保存到另一表中,明显是个插入或者更新操作,你怎么能写成select呢,你这不是被语法困住了,是被技术、思维困住了啊。
------解决方案--------------------
应该可以不用函数的,以下举个简单的例子,希望对LZ有用.
create table #t(orderid varchar(5),qty int)
insert into #t
select 'A',3 union all
select 'B',5
-- 产生3笔A记录和5笔B记录.
select a.orderid,b.number
from #t a
cross apply
(select number
from master.dbo.spt_values
where type='P' and number between 1 and a.qty) b
/*
orderid number
------- -----------
A 1
A 2
A 3
B 1
B 2
B 3
B 4
B 5
(8 row(s) affected)
*/