我使用下面的存储过程从另一个视图中插入记录:
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;'这样的日期它将从源复制并使用此存储过程插入目标。
此致
答案 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