存储过程语句终止错误?

时间:2017-08-18 08:54:45

标签: sql stored-procedures insert null sql-server-2014

我使用下面的存储过程从另一个视图中插入记录:

ALTER PROCEDURE [dbo].[SPemployeeinsert]
    (@date DATETIME)
AS 
BEGIN 
    DECLARE @idinsert AS INT 

    SELECT @idinsert = MAX (ID) + 1 
    FROM dbo.EMP

    INSERT INTO [SRV-RVS].dbo.emp (LASTNAME, ID)
        SELECT 
            [FirstName], 
            @idinsert + ROW_NUMBER() OVER (ORDER BY [FirstName]) - 1
        FROM 
            drv-rds2014.[HumanResources].[testEmployeeView]
        WHERE 
            ModifiedDate = @date 

    INSERT INTO [SRV-RVS].dbo.empldf(CIVILID, JOBTITLE, ISSUEDATE, ID)
        SELECT
            [PhoneNumber], [JobTitle], [ModifiedDate], 
            @idinsert + ROW_NUMBER() OVER (ORDER BY [FirstName]) - 1
        FROM 
            drv-rds2014.[HumanResources].[testEmployeeView]
        WHERE  
            ModifiedDate = @date
END

执行存储过程时出现此错误:

  

Msg 515,Level 16,State 2,Procedure SPemployeeinsert,Line 42
  无法将值NULL插入列'ID',表'SRV-RVS.dbo.EMP';列不允许空值。 INSERT失败。

     

Msg 515,Level 16,State 2,Procedure SPemployeeinsert,Line 48
  无法将值NULL插入列'ID',表'SRV-RVS.dbo.EMPLDF';列不允许空值。 INSERT失败。

我正试图通过像'01 / 04/2009;'这样的日期它将从源复制并使用此存储过程插入目标。

此致

Screenshot

Stored procedure

3 个答案:

答案 0 :(得分:0)

select @idinsert= MAX (ID)+1 from dbo.EMP
    where ID= @idinsert 

返回null。删除where子句

答案 1 :(得分:0)

当您尝试在不允许空值的列上插入空数据时,会出现此错误。 在您的查询中,当您在两个表中插入数据时,id不能为null。您可以插入ID或将ID作为标识。

答案 2 :(得分:0)

您的手术有一些问题。第一:

DECLARE @idinsert as int
select @idinsert= MAX (ID)+1 from dbo.EMP
where ID= @idinsert 

变量@idinsert未初始化,因此其值为NULL。您需要将其更改为:

DECLARE @idinsert as int
select @idinsert= MAX(ID)+1 from dbo.EMP

第二个问题 - 对于@date,您的视图drv-rds2014. [HumanResources].[testEmployeeView]可能会返回多个值,并且插入查询将导致列Id中的重复值失败。您需要将insert语句更改为:

INSERT [SRV-RVS].dbo.emp (LASTNAME,ID)
  SELECT [FirstName],@idinsert + ROW_NUMBER() OVER (ORDER BY [FirstName]) - 1
  FROM drv-rds2014. [HumanResources].[testEmployeeView]
  WHERE ModifiedDate=@date 

  insert [SRV-RVS].dbo.empldf
  (CIVILID,JOBTITLE,ISSUEDATE,ID)
  select [PhoneNumber],[JobTitle],[ModifiedDate],@idinsert + ROW_NUMBER() OVER (ORDER BY [FirstName]) - 1
  FROM drv-rds2014. [HumanResources].[testEmployeeView]
  WHERE  ModifiedDate=@date