none
SQL 批量插入数据问题? RRS feed

  • 问题

  • 当表为空时可以向其中插入9999条随即产生的数据,但当表不为空时,插入9999数据时只能插入1598条数据(每次都是1598,再别的机器上测试是860,但都是固定的),但是当再次执行插入数据时(无论插入多少),上次少插入的8401条数据会再表中显示出来,这是为什么?
    - - - - - - - - - - - - - - - - - 
    ALTER proc [dbo].[usp_addCard]
    @cardName varchar(50),
    @cardpValue int,
    @cardPrice float,
    @num int
    as
    begin
    declare @cardId varchar(50),@cardpwd varchar(50),@i int
    set @i = 0
    if exists(select name from (select name = @cardName)a where name like '%魔兽%')
    begin
    while @i < @num
    begin
    select @cardId = 'MS'+convert(varchar(50),convert(varchar(50),cast(RAND()*100000 as int))+convert(varchar(50),cast(RAND()*1000000 as int))+convert(varchar(50),cast(RAND()*1000000 as int)))
    select @cardpwd = convert(varchar(50),convert(varchar(50),cast(RAND()*100000 as int))+convert(varchar(50),cast(RAND()*1000000 as int)))
    insert into tb_card values(@cardId,@cardName,@cardpwd,@cardPrice,@cardpValue,'images/card/2.jpg')
    set @i = @i+1
    end
    end
    else if exists(select name from (select name = @cardName)a where name like '%网易%')
    begin
    while @i < @num
    begin 
    select @cardId = 'WY'+convert(varchar(50),convert(varchar(50),cast(RAND()*100000 as int))+convert(varchar(50),cast(RAND()*1000000 as int))+convert(varchar(50),cast(RAND()*1000000 as int)))
    select @cardpwd = convert(varchar(50),convert(varchar(50),cast(RAND()*100000 as int))+convert(varchar(50),cast(RAND()*1000000 as int)))
    insert into tb_card values(@cardId,@cardName,@cardpwd,@cardPrice,@cardpValue,'images/card/1.jpg')
    set @i = @i+1
    end
    end
    end

    这是我的SQL语句,


    执行 insert ..1条.. 结果为 1行影响,
    执行 insert ..9999条.. 结果为 1599行,
    执行 insert ..1条.. 结果为 10001
    谁能帮忙解释下?????,在数据库中执行多少行都没问题,但在JSP里面调用存储过程就出错,

    2011年3月18日 13:50

答案

  • 你对rand的使用有误。

    rand的文档提到:

    使用同一个种子值重复调用 RAND() 会返回相同的结果。

    对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

    SELECT RAND(100), RAND(), RAND()

    想不想时已是想,不如不想都不想。
    • 已标记为答案 MSSSSSSS 2011年3月20日 4:06
    2011年3月20日 1:55
    版主

全部回复

  • 没提供具体错误?

    是不是cardId有唯一约束或者索引,导致你插入数据报告冲突?

    这个可能是你随即生成卡号的算法有问题,估计出现重复的cardId,建议使用其他方式生成(序号方式,或者改进你算法,发现重复重新随机。)


    family as water
    2011年3月18日 15:47
  • Set profiler trace to find out details.
    2011年3月18日 15:53
  • 没提供具体错误?

    是不是cardId有唯一约束或者索引,导致你插入数据报告冲突?

    这个可能是你随即生成卡号的算法有问题,估计出现重复的cardId,建议使用其他方式生成(序号方式,或者改进你算法,发现重复重新随机。)


    family as water

     

    每次插入的条数是固定的 只受不同的机器而条数不同

    而且不可能时重复,因为这个概率比买彩票中1个亿都难,
    • 已编辑 MSSSSSSS 2011年3月19日 3:21 少了
    2011年3月19日 3:20
  • Set profiler trace to find out details.

    什么意思? ? ?
    2011年3月19日 3:21
  • Profiler is sql trace tool, can tell what happens inside sql when you run a query.
    • 已标记为答案 MSSSSSSS 2011年3月19日 13:22
    • 取消答案标记 MSSSSSSS 2011年3月19日 13:22
    2011年3月19日 4:09
  • 你对rand的使用有误。

    rand的文档提到:

    使用同一个种子值重复调用 RAND() 会返回相同的结果。

    对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

    SELECT RAND(100), RAND(), RAND()

    想不想时已是想,不如不想都不想。
    • 已标记为答案 MSSSSSSS 2011年3月20日 4:06
    2011年3月20日 1:55
    版主
  • 你对rand的使用有误。

    rand的文档提到:

    使用同一个种子值重复调用 RAND() 会返回相同的结果。

    对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

    SELECT RAND(100), RAND(), RAND()

    想不想时已是想,不如不想都不想。

    感觉你的解释最有说服力了,我试试 3Q
    2011年3月20日 4:07