select 后插入不行么,为啥非要写入函数里。

解决方案 »

  1.   

    用insert into targettable(col1,col2....) select col1,col2.... from sourcetable where....不行么
      

  2.   


    大哥根据条件查询表Order的数据, 将符合条件的表Order数据写入表BarCode (一条表Order数据, 可能写入多条表BarCode,字段值不同)
    你看清楚我的需求啊
    不是一条数据从一个表插入另一个表。。
    而是根据计算结果 从一个表插入N个数据到另一个表
      

  3.   

    大哥 我没太懂你的意思。 这个SQL insert into targettable(col1,col2....) select col1,col2.... from sourcetable where 你能用数据给我举两个例子么 谢谢。
      

  4.   

    大哥 我觉得你还是没明白我的意思。我给你举个数据的例子吧
    表Order
    ID     Quantity    BoxQuantity     AllotID
    1          1000             500              P1234
    2          1000             500              P1234
    3          1000             500              P1234根据SQL语句 select dbo.CreateBarCode(Order.OrderID,Order.Quantity,Box.BoxQuantity) from Order inner join Box on Order.BoxID=Box.BoxID where Order.AllotID='P1234'会查出4条订单数据。  他们调用CreateBarCode函数,传入字段参数,CreateBarCode会调用4次在CreateBarCode函数的内部--生成条码的自定义函数
    function CreateBarCode(@OrderID varchar,@Quantity int,@BoxQuantity int)
    return bit
    as
    begin
            declare @count int = @Quantity/@BoxQuantity;   --1000/500 等于两条。那么同一个OrderID 会往BarCode表写两条数据
            while(@count>0)
            begin
                 --insert into BarCode ...此处省略  新增该订单条码数据
            end
    end 一个OrderID的数据 会往BarCode表写两条数据
    之前查了4条Order数据, BarCode就会新增8条数据。 
    我是这个逻辑
    大哥的那个写法 insert xxx select 我用过。 但是数据和数据是一对一的。 中间没能做逻辑运算。 
    大哥你这下应该明白我的意思了吧。。
     
      

  5.   

    大哥 我觉得你还是没明白我的意思。我给你举个数据的例子吧
    表Order
    ID     Quantity    BoxQuantity     AllotID
    1          1000             500              P1234
    2          1000             500              P1234
    3          1000             500              P1234根据SQL语句 select dbo.CreateBarCode(Order.OrderID,Order.Quantity,Box.BoxQuantity) from Order inner join Box on Order.BoxID=Box.BoxID where Order.AllotID='P1234'会查出4条订单数据。  他们调用CreateBarCode函数,传入字段参数,CreateBarCode会调用4次在CreateBarCode函数的内部--生成条码的自定义函数
    function CreateBarCode(@OrderID varchar,@Quantity int,@BoxQuantity int)
    return bit
    as
    begin
            declare @count int = @Quantity/@BoxQuantity;   --1000/500 等于两条。那么同一个OrderID 会往BarCode表写两条数据
            while(@count>0)
            begin
                 --insert into BarCode ...此处省略  新增该订单条码数据
            end
    end 一个OrderID的数据 会往BarCode表写两条数据
    之前查了4条Order数据, BarCode就会新增8条数据。 
    我是这个逻辑
    大哥的那个写法 insert xxx select 我用过。 但是数据和数据是一对一的。 中间没能做逻辑运算。 
    大哥你这下应该明白我的意思了吧。。
     
    兄弟啊,select时是可以对选择的数据进行汇总的啊,别一根筋啊, 不知道你那插入的数据生成规则,没法给你写出来。不过看你问的问题,真替你着急啊。
      

  6.   

    看需求,你那很明显是根据查出来的基础表数据汇总后,保存到另一表中,明显是个插入或者更新操作,你怎么能写成select呢,你这不是被语法困住了,是被技术、思维困住了啊。
      

  7.   

    存储过程必须用exec调用。 这点我没法在一条select中去调用。
      

  8.   

    应该可以不用函数的,以下举个简单的例子,希望对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)
    */
      

  9.   

    用存儲過程嵌套不就可以實現了嗎
    裡面的寫插入數據操作,外面的根據select dbo.CreateBarCode(Order.OrderID,Order.Quantity,Box.BoxQuantity) from Order inner join Box on Order.BoxID=Box.BoxID 這個的記錄循環執行裡面的存儲過程就可以拉。
    自己可以嘗試寫下。
      

  10.   

    谢谢各位的热心回答, 这个问题我解决了,使用的for xml path ,将所有查询出来的数据按照自己定义的格式融合成一个字符串,
    然后循环解析这个字符串, 拼接成新的sql语句(用于插入BarCode)。