【问题标题】:Stored procedure throws error in SQL Server 2012 but works fine in SQL Server 2000存储过程在 SQL Server 2012 中引发错误,但在 SQL Server 2000 中工作正常
【发布时间】:2013-12-11 22:25:54
【问题描述】:

我有一个存储过程在 SQL Server 2000 中运行良好,但在我们将数据库移动到的 SQL Server 2012 Express 上引发错误。

[SQLServer JDBC 驱动程序][SQLServer]INSERT 语句的选择列表包含的项目少于插入列表。 SELECT 值的数量必须与 INSERT 列的数量相匹配。

谁能帮我解决这个问题?

CREATE PROCEDURE spSelectTopCourses
AS   
   declare @divisor int
   declare @column int

   set @column = 6 -- number of columns in the site

   create table #tmpID (
       CityID int
   )

   insert into #tmpID (CityID)
      Select top 40 -- total number of cities to be shown
         c.RID as CityID
      From Course c
      Inner join StateRegions Sr on Sr.RID = c.RID
      Inner join Client_Round cr on cr.CourseID = c.CourseID
      Group by c.RID
      Order by Count(cr.OrderID) desc

    create table #tmp (
        CityID int,
        CityName varchar(100),
        TotalOrder int identity(1,1)
    )

insert into #tmp (CityID, CityName, TotalOrder)
   Select distinct 
           sr.RID as CityID,
           sr.Rname as CityName
       From 
           #tmpID tid 
       Inner join StateRegions Sr on Sr.RID = tid.CityID
       Group by Sr.RName, sr.RID
       Order by sr.RName

    select @divisor = ceiling(count(*) * 1.0 / @column) 
    from #tmp

    create table #tmpC (
       Position int
    )

    declare @i int
    set @i = 1

    while @i <= @divisor * @column
    begin
        insert into #tmpC(Position) 
           select @i
        set @i = @i + 1
    end

    select 
       t.CityID, t.CityName + ' Golf' CityName, cnt.CountryID, c.Position, 
       (c.Position - 1) % @divisor WebOrder1, 
       (c.Position - 1) / @divisor WebOrder2
    from 
       #tmpC c
    left join #tmp t on t.TotalOrder = c.Position
    inner join StateRegions sr on sr.RID = t.CityID
    inner join CountryStates cs on cs.StateID = sr.StateID
    inner join Country cnt on cnt.CountryID = cs.CountryID
    order by WebOrder1, WebOrder2

    drop table #tmpC 
    drop table #tmp
    drop table #tmpID

【问题讨论】:

  • 答案就在错误信息中:)
  • 好吧,我删除了 TotalOrder,一切都很好:-)

标签: sql-server sql-server-2012 sql-server-2000


【解决方案1】:
insert into #tmp (CityID, CityName, TotalOrder)
Select distinct sr.RID as CityID,
     sr.Rname as CityName
From #tmpID tid 
Inner join StateRegions Sr on Sr.RID = tid.CityID
Group by Sr.RName,
     sr.RID
Order by sr.RName

您尝试在#tmp 中插入 3 列,但查询只返回 2 列

我怀疑,您希望 Count(*)Sum(Orders) 作为第三列

【讨论】:

  • 它可能适用于 SQL Server 2000,因为它将NULL 插入到额外的列中,并且行为在 2012 年发生了变化。
  • 他真的应该从插入列表中删除“TotalOrder”,因为它是每个 DDL 的 ID 列。
  • 很好,没注意到...谢谢
  • 好吧,我删除了 TotalOrder,一切都很好:-)
  • 非常感谢大家!
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 2016-10-16
相关资源
最近更新 更多