none
小问题求解决~~ RRS feed

  • 问题

  • 我想要批量更新一下数据

    先是查询一下

    select * from card_group where cardid like'%n%'

    返回12个结果。

    接着

    update card_group set time='2013-12-31 23:59:59.000'  where cardid like'%n%'

    服务器: 消息 512,级别 16,状态 1,过程 tr_upd_card_group
    ,行 30

    就出现错误 出现“子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

    -------------------------------------------------


    • 已编辑 looksoks 2012年12月3日 7:00
    2012年12月3日 1:46

答案

  • 你不会真删吧??????

    你把 select cardid from inserted 改为 select  top 1 cardid from inserted  应该可以避免错误,但是这样会不会破坏你的业务规则呢?如果破坏的话,那跟删触发器没有区别。如果OK的话,那你就加 TOP 1吧



    Please click the Mark as Answer button if a post solves your problem!

    • 已编辑 Michael CS 2012年12月3日 9:27
    • 已标记为答案 looksoks 2012年12月4日 4:36
    2012年12月3日 9:27

全部回复

  • card_group  是视图还是表?

    如果是视图,确认是否是可以更新的视图。


    family as water


    • 已编辑 Stone Z 2012年12月3日 1:48
    2012年12月3日 1:48
  • 是表。

    select * from card_group where cardid='bn000040'

    返回只有1个

    但是我

    update card_group set time='2013-12-31 23:59:59.000'  where cardid='bn000040'

    却发现有2条

    (所影响的行数为 1 行)


    (所影响的行数为 1 行)

    2012年12月3日 1:52
  • It only updated one row, otherwise message will be (affected 2 lines).
    2012年12月3日 2:53
  • 表 是不是 做了 对应的 BackUp表?

    2012年12月3日 2:59
  • 做了backup表 就会这样吗?
    2012年12月3日 3:28
  • Shouldn't.
    2012年12月3日 3:44
  • 是表。

    select * from card_group where cardid='bn000040'

    返回只有1个

    但是我

    update card_group set time='2013-12-31 23:59:59.000'  where cardid='bn000040'

    却发现有2条

    (所影响的行数为 1 行)


    (所影响的行数为 1 行)

    是不是用了触发器 或者用了联级更新?如果是,把触发器的代码发上来看看。
     
    2012年12月3日 4:05
  • 我看了一下 触发器里面没有。

    但是我发现 视图里面也有一个view_card_group。打开后发现内容和表里面card_group是一样的。


    然后我

    update view_card_group set time='2013-12-31 23:59:59.000'  where cardid='bn000040'

    也是

    (所影响的行数为 1 行)

    (所影响的行数为 1 行)

    那肯定是有联级更新了

    那么请问我这条语句应该如何执行成功呢?

    update card_group set time='2013-12-31 23:59:59.000'  where cardid like'%n%'

    服务器: 消息 512,级别 16,状态 1,过程 tr_upd_card_group
    ,行 30

    子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
    语句已终止。


    • 已编辑 looksoks 2012年12月3日 6:52
    2012年12月3日 5:48
  • “服务器: 消息 512,级别 16,状态 1,过程 tr_upd_card_group”

    这不是已经很明显了嘛,检查触发器tr_upd_card_group。

    还有看看关联的外键表有没有什么其他的触发器

    Please click the Mark as Answer button if a post solves your problem!


    2012年12月3日 6:53
  • view_card_group  也没有触发器

    它报错的时候提示 过程tr_upd_card_group 但是我找不到。

    2012年12月3日 7:00
  • 我找了很久都没找到 tr_upd_card_group

    2012年12月3日 7:04
  • view_card_group  也没有触发器

    它报错的时候提示 过程tr_upd_card_group 但是我找不到。


    select name  from [sys].[all_objects] where

       object_id= ( select [parent_object_id]  from [sys].[all_objects] where name= 'tr_upd_card_group')



    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 7:04
  • 对象名[sys].[all_objects] 无效。
    2012年12月3日 7:15
  • 对象名[sys].[all_objects] 无效。

    你2000啊,我没有2000,网上搜一下吧


    Please click the Mark as Answer button if a post solves your problem!


    2012年12月3日 7:35
  • select * from syscomments

    select * from sysobjects

    找到了 大师在看一下。

    CREATE TRIGGER tr_upd_card_group ON [dbo].[card_group]   FOR UPDATE   AS  declare @webtimemark int  select @webtimemark=webtimemark from inserted  if @webtimemark=99      

    update card_group set webtimemark=0 where cardid=(select cardid from inserted)  else       u


    • 已编辑 looksoks 2012年12月3日 8:23
    2012年12月3日 8:22
  • select * from syscomments

    select * from sysobjects

    找到了 大师在看一下。

    CREATE TRIGGER tr_upd_card_group ON [dbo].[card_group]   FOR UPDATE   AS  declare @webtimemark int  select @webtimemark=webtimemark from inserted  if @webtimemark=99      

    update card_group set webtimemark=0 where cardid=(select cardid from inserted)  else       u


     
    "select cardid from inserted"  返回多个值造成的,你现在应该知道怎么改了吧


    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 8:34
  • 还是请大师 明盘了吧。
    2012年12月3日 8:42
  • 你把那个触发器删了算了。因为在我不知道你业务规则的情况下,告诉你加TOP 1 跟删除触发器 ,从本质上说,对我来说都是一样的,都有可能破坏你的业务规则,这也是在上面没有直接给你答案的原因,你明白了不?


    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 9:12
  • 好的 我先删了 然后再加上去
    2012年12月3日 9:23
  • 好的 我先删了 然后再加上去

    。。。。。。。。。。


    Please click the Mark as Answer button if a post solves your problem!

    2012年12月3日 9:23
  • 你不会真删吧??????

    你把 select cardid from inserted 改为 select  top 1 cardid from inserted  应该可以避免错误,但是这样会不会破坏你的业务规则呢?如果破坏的话,那跟删触发器没有区别。如果OK的话,那你就加 TOP 1吧



    Please click the Mark as Answer button if a post solves your problem!

    • 已编辑 Michael CS 2012年12月3日 9:27
    • 已标记为答案 looksoks 2012年12月4日 4:36
    2012年12月3日 9:27
  •  我还没删。估计在查询分析器里也删不了。

    我吧它替换null 说我不能替换 text 说是计算列

    • 已编辑 looksoks 2012年12月3日 9:36
    2012年12月3日 9:34
  • LZ可以参考一下这篇文章,关于计算列的

    http://database.ctocio.com.cn/dbzjdysummary/48/8730048_4.shtml

    Nullability
    一个计算列值的Nullability将由数据库引擎本身来确定。一个非空参照列的结果可能在某些情况下是空值,以便避免可能的益处或者下溢。如果需要,那么你可以使用ISNULL(check_expression,,常数)来提供一个NULL的替代值。


    一些限制

    对于SQL Server 2000,你不能创建一个persisted计算列。

    你不能从其它表中参照列直接用于一个计算列。

    你不能在计算列中应用插入或者更新的语句。

    LZ可以看一下你的表有没有计算列存在


    给我写信: QQ我:点击这里给我发消息


    2012年12月3日 14:18
  •  我还没删。估计在查询分析器里也删不了。

    我吧它替换null 说我不能替换 text 说是计算列

    You are better to work with app developer on this issue.
    2012年12月3日 14:39
  •  我还没删。估计在查询分析器里也删不了。

    我吧它替换null 说我不能替换 text 说是计算列

    你好,

    还是先了解下有这个触发器tr_upd_card_group的原因吧, 这样能更好的帮你修改代码。

    Thanks.



    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年12月4日 2:13
    版主
  • 加了 top1 就成功执行了。

    昨天用的是 select * from syscomments

    找到text 不全 else 后面 就只有一个u

    一定要用 sp_helptext  存储过程名称  ----才可以看到全部

    然后用 alter trigger 修改了语句加了top1

    update card_group set time='2013-12-31 23:59:59.000'  where cardid like'%n%'

    我在去掉了 top1 以免破坏“结构”

    谢谢各位大师。

    2012年12月4日 4:43