SQL Server:存储过程尝试插入NULL?

时间:2010-11-20 00:59:28

标签: sql sql-server tsql sql-server-2008 stored-procedures

Msg 515, Level 16, State 2, Procedure CreateParty, Line 16
Cannot insert the value NULL into column 'Id', table 'DEVIN.dbo.Party';
     

列不允许空值。插入   失败。       声明已经终止。

(1 row(s) affected)

到底是什么?我的表由

组成
Id (Primary Key)
FirstName
LastName

这是我的存储过程:

USE [DEVIN]
GO
/****** Object:  StoredProcedure [dbo].[CreateParty]    Script Date: 11/19/2010 16:59:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      
-- Create date: 
-- Description: 
-- =============================================
ALTER PROCEDURE [dbo].[CreateParty]
    @firstname varchar(50),
    @lastname varchar(50)
    --@emailaddress varchar(100),
    --@zipcode char(5)
AS
BEGIN

    SET NOCOUNT ON;

    INSERT INTO Party (FirstName, LastName)
    Values (@firstname,@lastname)

END

有人能找出为什么我会得到那个错误吗?这太烦人了......


此外,由于某种原因,SQL Management仅显示intellisense中的“Id”列。我不知道为什么......

截图: alt text

它是否还没有“PK_Party”身份?它会自动执行此操作..我必须遗漏某些内容......

5 个答案:

答案 0 :(得分:8)

INSERT INTO Party (FirstName, LastName)
    Values (@firstname,@lastname)

您没有为列Id指定值,因此INSERT将尝试插入默认值:

  • 对于IDENTITY()列,默认值为下一个标识
  • 对于具有DEFAULT约束的列,默认值将是约束的值
  • 其他一切都将是NULL

发布表格的 Exact 定义,以便我们告诉您列的默认值是什么。

答案 1 :(得分:4)

ID是身份还是主键? PK本身不会填充插入列的任何数据。

答案 2 :(得分:0)

使用指定的标识删除并重新创建表。如果你已经有数据,那就更复杂了。

用于创建具有标识的表的scritp示例:

USE [MyDatabase]
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type in (N'U'))
DROP TABLE MyTable
GO


CREATE TABLE MyTable(
    [ID] [int] IDENTITY (1,1) NOT NULL,
    [LASTNAME] [varchar](500) NULL,
    [FIRSTNAME] [varchar](500) NULL


) ON [PRIMARY]

GO

答案 3 :(得分:0)

为此,您必须创建相同的主键值I.e.自动递增。 主键是升序集群索引,它不能为空。 您必须创建1或任何值的身份增量。

至于现在你必须再次创建表,并且通过设计你必须增加值。

答案 4 :(得分:-2)

尝试使用代码

INSERT INTO Party
Values (@firstname,@lastname)

而不是INSERT INTO Party (FirstName, LastName) Values (@firstname,@lastname)