【问题标题】:SQL Server INSERT … SELECT Statement won't parseSQL Server INSERT ... SELECT 语句不会解析
【发布时间】:2012-10-25 08:15:12
【问题描述】:

我在使用 SQL Server 2005 时收到以下错误消息

消息 120,级别 15,状态 1,过程 EPIN,第 37 行
INSERT 语句的选择列表包含的项目少于插入列表。 SELECT 值的数量必须与 INSERT 列数。

我已将选择列表和插入列表复制并粘贴到 excel 中,并验证每个列表中的项目数量相同。两个表的附加主键字段都没有在插入语句或选择列表中列出。我不确定这是否相关,但可能是可疑的。

这是我的存储过程的源代码:

 set ANSI_NULLS ON
 set QUOTED_IDENTIFIER ON
 go

 -- =============================================
 -- Author:     Kristian Manuel
 -- Create date: 10/3/2012
 -- Description:    
 -- =============================================
 ALTER PROCEDURE [dbo].[EPIN] 
-- Add the parameters for the stored procedure here
     @PLUCODE varchar(30),      --Table tblPolicy
     @ECPAYFEES numeric(18,2),
     @COSTPAYABLE numeric(18,2),
     @RETAILPRICE numeric(18,2),
     @DENOMINATION varchar(50),
     @CARDNAME varchar(50),
     @DistributorID varchar(8),
     @AccntID decimal(18,0)

 --PO1  
 AS
 BEGIN
     -- SET NOCOUNT ON added to prevent extra result sets from
     -- interfering with SELECT statements.
     SET NOCOUNT ON;

     INSERT INTO [ECPAY-PC].[GENESIS].[dbo].[tblPolicy]
     ( 
       PolicyID                 ,
       AccountTID               ,
       DistributorID            ,
       CARDNAME                 ,
       DENOMINATION             ,
       RETAILPRICE              ,
       COSTPAYABLE              ,
       ECPAYFEES                ,
       PLUCODE 
     ) 
     SELECT 
         t.* 
     FROM
        (SELECT 
            AccountTID = @AccntID, 
            DistributorID = @DistributorID, 
            CARDNAME = @CARDNAME,      
            DENOMINATION = @DENOMINATION, 
            RETAILPRICE = @RETAILPRICE, 
            COSTPAYABLE = @COSTPAYABLE,      
            ECPAYFEES = @ECPAYFEES, 
            PLUCODE = @PLUCODE) t,
        [ECPAY-PC].[ECPNWEB].[dbo].[account] a
     WHERE
        a.AccntID = t.AccountTID --for account
 END

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures


    【解决方案1】:

    错误消息非常清楚 - 您的 INSERT 语句需要 9 列

       1. PolicyID                 
       2. AccountTID               
       3. DistributorID            
       4. CARDNAME                 
       5. DENOMINATION             
       6. RETAILPRICE              
       7. COSTPAYABLE              
       8. ECPAYFEES                
       9. PLUCODE 
    

    待填 - 但您的 SELECT 仅提供 8 个值

       1. AccountTID               
       2. DistributorID            
       3. CARDNAME                 
       4. DENOMINATION             
       5. RETAILPRICE              
       6. COSTPAYABLE              
       7. ECPAYFEES                
       8. PLUCODE 
    

    您似乎没有为您的SELECT 语句中的PolicyID 列(yoru INSERT 中的第一列)提供任何值.....

    更新:如果您的目标表中的 PolicyID 列是“自动增量”(或 IDENTITY)列 - 那么您不得包含在在你的INSERT 声明中!

    就用这个吧:

     INSERT INTO [ECPAY-PC].[GENESIS].[dbo].[tblPolicy]
     (AccountTID, DistributorID, CARDNAME, DENOMINATION,
      RETAILPRICE, COSTPAYABLE, ECPAYFEES, PLUCODE)
    
        SELECT (that provides those 8 values) .... 
    

    如果您从 INSERT 语句中省略 PolicyID,则 SQL Server 将自动为其分配一个 identity 值,并且您的 INSERT .... SELECT 语句将不起作用,因为您为 @987654336 提供了 8 个值@ 需要 8 列...

    【讨论】:

    • PolicyID 是一个自动增量列,所以我没有把它放在 select ..thanks
    • @KristianHernanC.Manuel:在这种情况下,您也不得将其包含在 INSERT 列表中!
    • 当我删除策略 ID 并执行它时工作正常,但是当我在程序中运行它时,错误是这样说不能将值 null 插入到列 'PolicyID',表 'GENESIS.dbo。 tblplicy;列不允许空值。插入失败。语句已终止..
    • @KristianHernanC.Manuel:在这种情况下,您的 应用程序代码 有一些问题 - 而不是您的 SQL ... --> 新问题
    • 这可能意味着 PolicyID 不是身份列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2012-10-18
    • 2019-08-24
    • 2010-11-09
    • 2011-12-04
    相关资源
    最近更新 更多