none
【求助】ALTER添加列后,立即UPDATE该列会报错 RRS feed

  • 问题

  • SQL 2008 R2

    请看语句:

    ALTER TABLE #t ADD col2 INT

    UPDATE #t

    SET col2 = 0

    报错:列名'col2'无效。

    但如果紧接的是SELECT,一切正常,可以发现col2成功添加到表中。

    非要接UPDATE的话,必须在ALTER后GO一下,不然报错无悬念。

    请问:能不能不GO,也能UPDATE。因为前面我定义了很多变量,一GO回到解放前,不甘心。

    2012年8月7日 8:40

答案

  • sql 的执行,是先分析并生成执行计划,再做实际的执行

    当你把 alter table 和 update 放在一齐的时候,在分析并生成执行计划这步,由于列不存在,所以无法为 update 生成执行计划,所以就报错了

    • 已标记为答案 ahdung_AI 2012年8月7日 10:25
    2012年8月7日 9:23
  • 你可以考虑这样,通过EXEC ,把UPDATE的执行计划生成放到执行时进行

    ALTER TABLE #t ADD col2 INT

    EXEC('

    UPDATE #t

    SET col2 = 0

    ')

    • 已标记为答案 ahdung_AI 2012年8月7日 10:24
    2012年8月7日 9:24

全部回复

  • sql 的执行,是先分析并生成执行计划,再做实际的执行

    当你把 alter table 和 update 放在一齐的时候,在分析并生成执行计划这步,由于列不存在,所以无法为 update 生成执行计划,所以就报错了

    • 已标记为答案 ahdung_AI 2012年8月7日 10:25
    2012年8月7日 9:23
  • 你可以考虑这样,通过EXEC ,把UPDATE的执行计划生成放到执行时进行

    ALTER TABLE #t ADD col2 INT

    EXEC('

    UPDATE #t

    SET col2 = 0

    ')

    • 已标记为答案 ahdung_AI 2012年8月7日 10:24
    2012年8月7日 9:24
  • 谢谢邹老师讲解和支招,目前我已经通过另一个渠道达到目的,你这招以后用得着,再次感谢~

    2012年8月7日 10:24
  • 留着以后有用

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

    2012年8月7日 11:37
  • 你可以考虑这样,通过EXEC ,把UPDATE的执行计划生成放到执行时进行

    ALTER TABLE #t ADD col2 INT

    EXEC('

    UPDATE #t

    SET col2 = 0

    ')

    exec 是不是只是提交update 这个语句的事务,对前面的事务没有影响?

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

    2012年8月7日 11:52
  • exec 是不是只是提交update 这个语句的事务,对前面的事务没有影响?

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


    exec 不就是对update 的执行吗?用动态的方式来执行update 语句。

    Learning SQL.

    2012年8月9日 3:01
  • 有一点点明白


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

    2012年8月9日 6:06