none
2000升级到2008后,insert into select的问题 RRS feed

  • 问题

  • 现象描述:数据库从2000升级到2008,升级后,有个procedure执行出错。提示指定的列名或值的个数与表定义的不一致。

    procedure中出错SQL:

    Insert Into test.dbo.Table1

    SELECT id,LEFT(CONVERT(VARCHAR, DATEADD(mm, 0, GETDATE()), 112), 6)

    FROM test.dbo.Table2(nolock)

    GROUP BY id

    其中,Table1有两个varchar字段和一个int字段,三个字段都可以为空。

    在2000里没有错误,但在2008里出错。而且,如果删掉“GROUP BY id”,在2000里也出错。

    问题:为什么在2000里没有错?为什么到了2008里就出错了?在2000里,为什么删掉“GROUP BY id”又出错了?虽然知道怎么改,但是需要给人家讲为什么要改,不能简单说升级后就有错,需要改。万分感谢!

    2013年1月4日 6:08

答案

  • 现象描述:数据库从2000升级到2008,升级后,有个procedure执行出错。提示指定的列名或值的个数与表定义的不一致。

    procedure中出错SQL:

    Insert Into test.dbo.Table1

    SELECT id,LEFT(CONVERT(VARCHAR, DATEADD(mm, 0, GETDATE()), 112), 6)

    FROM test.dbo.Table2(nolock)

    GROUP BY id

    其中,Table1有两个varchar字段和一个int字段,三个字段都可以为空。

    在2000里没有错误,但在2008里出错。而且,如果删掉“GROUP BY id”,在2000里也出错。

    问题:为什么在2000里没有错?为什么到了2008里就出错了?在2000里,为什么删掉“GROUP BY id”又出错了?虽然知道怎么改,但是需要给人家讲为什么要改,不能简单说升级后就有错,需要改。万分感谢!

    Hi,

    根据你下文给出来的信息,你的table1不是在test1这个数据库里面,table2不是在test2这个数据库里么,怎么查询的时候变成了test数据库了. 请你检查一下。

    Best Regards,
    Amy Peng


    Amy Peng
    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.




    2013年1月9日 6:04
    版主

全部回复

  • 2008里test.dbo.Table1的schema是什么,ID是不是自增的? 好好查一下,跟2000是不是一样的


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



    2013年1月4日 6:33
  • Insert Into test.dbo.Table1

    SELECT id,LEFT(CONVERT(VARCHAR, DATEADD(mm, 0, GETDATE()), 112), 6)

    FROM test.dbo.Table2(nolock)

    GROUP BY id

    其中,Table1有两个varchar字段和一个int字段,三个字段都可以为空。

    Table1有三个字段,但是查询只有两个字段啊?不匹配。另外问一下数据库的兼容级别是多少?

    2013年1月4日 9:10
  • to KevinLiu2

    >Table1有三个字段,但是查询只有两个字段啊?不匹配。

    是不匹配,可是在2000里就不出错,2008里就出错。晕啊。。。。

    >另外问一下数据库的兼容级别是多少?

    2000:SQL Server 2000 (80)

    2008:SQL Server 2008 (100)


    2013年1月5日 1:44
  • 2008里test.dbo.Table1的schema是什么,ID是不是自增的? 好好查一下,跟2000是不是一样的


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



    schema就是dbo,表没有任何约束、索引之类的,ID只是普通varchar类型的字段。。。
    2013年1月5日 1:48
  • Can you post completed error message and schema of both tables?
    2013年1月5日 2:35
  • Can you post completed error message and schema of both tables?

    error message:列名または指定された値の数がテーブルの定義と一致しません。

    DB : test1(Table1), test2(Table2)

    schema : dbo(Table1), test1(Table2)

    DB : test1(Table1), test2(Table2)
    2013年1月5日 3:17
  • Schema of table means all columns with data type and so in the table. Do you have error number by the way? Easier than learning Japanese.
    2013年1月5日 4:05
  • Schema of table means all columns with data type and so in the table. Do you have error number by the way? Easier than learning Japanese.

    Sorry, I'm not good at English.

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

    USE [test1]

    CREATE TABLE [dbo].[Table1](
    [col1] [varchar](14) NULL,
    [col2] [varchar](6) NULL,
    [col3] [int] NULL
    ) ON [PRIMARY]

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

    USE [test2]

    CREATE TABLE [test1].[Table2](
    [col1] [varchar](14) NULL,
    [col2] [varchar](6) NULL,
    [col3] [int] NULL
    ) ON [PRIMARY]

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

    There is not index or other constraint in the two tables.

    Full message:

    "メッセージ 213、レベル 16、状態 1、行 1

    列名または指定された値の数がテーブルの定義と一致しません。"

    "213" is the error number. I guess......

    2013年1月5日 5:38
  • Why use convert function while all columns in both tables have same data type and length?
    2013年1月5日 19:10
  • Why use convert function while all columns in both tables have same data type and length?
    To change current time (type : datetime) to a string like "yyyymm".
    2013年1月6日 1:20
  • But table1 and table2 have same schema as you posted, where comes datetime?
    2013年1月6日 2:21
  • But table1 and table2 have same schema as you posted, where comes datetime?

    The getdate function.

    SQL:

    "......

    SELECT id,LEFT(CONVERT(VARCHAR, DATEADD(mm, 0, GETDATE()), 112), 6)

    ......"

    2013年1月6日 5:56
  • 现象描述:数据库从2000升级到2008,升级后,有个procedure执行出错。提示指定的列名或值的个数与表定义的不一致。

    procedure中出错SQL:

    Insert Into test.dbo.Table1

    SELECT id,LEFT(CONVERT(VARCHAR, DATEADD(mm, 0, GETDATE()), 112), 6)

    FROM test.dbo.Table2(nolock)

    GROUP BY id

    其中,Table1有两个varchar字段和一个int字段,三个字段都可以为空。

    在2000里没有错误,但在2008里出错。而且,如果删掉“GROUP BY id”,在2000里也出错。

    问题:为什么在2000里没有错?为什么到了2008里就出错了?在2000里,为什么删掉“GROUP BY id”又出错了?虽然知道怎么改,但是需要给人家讲为什么要改,不能简单说升级后就有错,需要改。万分感谢!

    Hi,

    根据你下文给出来的信息,你的table1不是在test1这个数据库里面,table2不是在test2这个数据库里么,怎么查询的时候变成了test数据库了. 请你检查一下。

    Best Regards,
    Amy Peng


    Amy Peng
    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.




    2013年1月9日 6:04
    版主