【问题标题】:SQL Server 2008 R2 Insert Stored Procedure Syntax with Identity FieldSQL Server 2008 R2 插入带有标识字段的存储过程语法
【发布时间】:2011-04-18 20:06:03
【问题描述】:

下午好,

我编写了一个非常基本的存储过程,用于将 QuestionText 和 QuestionStatus 插入 Questions 表中,并且 QuestionID int 主键设置为具有标识。

语法如下:

CREATE PROCEDURE InsertNewQuestion 
-- Add the parameters for the stored procedure here
@QuestionText varchar(200), @QuestionStatus bit
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT into Questions
(QuestionText,QuestionStatus) 
Values
(@QuestionText),(@QuestionStatus)
END
GO

当我执行存储过程时,我收到以下错误:

INSERT 语句中的列数多于 VALUES 中指定的值 条款。 VALUES 子句中的值数必须与列数匹配 在 INSERT 语句中指定。

正确插入记录并允许 QuestionID 在每次插入时自动递增的正确语法是什么?

非常感谢您的帮助和指导。

更新的存储过程语法

【问题讨论】:

  • 您的 Values 行仍在关闭每个参数的括号。它们都应该放在一个用逗号分隔的括号中。值(@QuestionText、@QuestionStatus)

标签: stored-procedures sql-server-2008-r2 identity-column


【解决方案1】:

删除 QuestionID 和 @@Identity + Values 应该是 (@QuestionText,@QuestionStatus)

INSERT into Questions
(QuestionText,QuestionStatus) 
Values
(@QuestionText,@QuestionStatus)

SQL Server 知道 QuestionID 是一个 Identity 字段,并将递增它.... :-)

如果您需要返回插入的标识,则在 SP 上创建一个 out 参数并通过调用 SCOPE_IDENTITY() 获取它。

SET @QuestionID = SCOPE_IDENTITY()

【讨论】:

    【解决方案2】:

    您没有指定标识列,并且值不应该在自己的括号中。

    INSERT into Questions
    (QuestionText,QuestionStatus) 
    Values
    (@QuestionText, @QuestionStatus)
    

    【讨论】:

      【解决方案3】:
      INSERT into Questions (QuestionText,QuestionStatus)  
      Values (@QuestionText,@QuestionStatus)
      

      即没有指定身份字段。

      【讨论】:

        【解决方案4】:
        CREATE PROCEDURE SPWITHPARAMETER_AND_RETURN_VALUE
          (
            @EMPID INT,
            @IDVAL INT,   
            @RETURNVALUE INT =0 OUT
          )
          AS 
            DECLARE @COUNT INT
          BEGIN
          SELECT @COUNT=COUNT(*) FROM JOINTABLE WHERE EMPID=@EMPID AND IDVAL=@IDVAL
            IF(@COUNT >0)
              BEGIN
        
                   SET @RETURNVALUE = 1;
                                     PRINT @RETURNVALUE    
                    RETURN @RETURNVALUE
                      END
                 ELSE
               BEGIN
                    SET @RETURNVALUE = 1;
                                      PRINT @RETURNVALUE
                    RETURN @RETURNVALUE
                                END
          END
        

        【讨论】:

          猜你喜欢
          • 2015-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多