2012-03-07 74 views
1

我有问题插入记录关于身份的特定表。但SQL总是告诉我,我需要打开identity_insert,但我已经为该表设置了标识列,以便我确信它不会生成多个标识。顺便说一句,我的表已经有记录。这里是我的代码身份列不工作

declare @empid int 
declare @trans_name varchar(max) = 'Append' 
declare @lname varchar(max) 
declare @fname varchar(max) 
declare @mname varchar(max) 
declare @emp_id varchar(max) 
declare @gender varchar(max) 
declare @bday datetime 
declare @allowance numeric(18,2) 
declare @emp_sysid numeric(18,0) 
declare @datehired datetime 
declare @status varchar(max) 
declare @positionid numeric(18,0) 

declare cc_cur cursor for 
    select emps.LNAME, emps.MNAME, emps.FNAME, emps.EMP_ID, 
    emps.GENDER, emps.BDAY, emps.ALLOWANCE, emps.SYSID, 
    emps.DATE_HIRED, emps.[STATUS], emps.POSITION_SYSID 
    from SPADA.dbo.M_EMPLOYEE emps 
     where emps.SYSID not in (select ISNULL(B.SPADAEmpID, 0) from SPADA_FIS.dbo.HRIS_Employees B 
           inner join SPADA_FIS.dbo.HRIS_EmployeeStatus C 
            on C.EmployeeID = B.EmployeeID where C.IsCurrent = 1) 

open cc_cur 
fetch next from cc_cur 
into @lname, @mname, @fname, @emp_id, 
    @gender, @bday, @allowance, @emp_sysid, 
    @datehired, @status, @positionid 

begin tran @trans_name 
    while @@FETCH_STATUS = 0 
    begin 
     insert into SPADA_FIS.dbo.HRIS_Employees 
     (LastName, MiddleName, FirstName, OtherName, 
     Gender, BirthDate, Allowance) 
     values 
     (@lname, @mname, @fname, @emp_id, 
     @gender, @bday, @allowance) 

     set @empid = SCOPE_IDENTITY() 

     insert into SPADA_FIS.dbo.HRIS_EmployeeStatus 
     (EmployeeID, EmploymentTypeID, DepartmentID, EmploymentTenureID, 
     Remarks, DateHired, JobOrganizationID, EmployeeStatusID, IsCurrent, 
     PayFrequencyID, TaxExemptionStatus) 
     values 
     (@empid, 1, 6, (select htet.EmploymentTenureID 
           from SPADA_FIS.dbo.HRIS_tblEmploymentTenures htet 
            where htet.Tenure = @status), 
     'Migrated Data', @datehired, (select htjo.JobOrganizationID from SPADA_FIS.dbo.HRIS_tblJobOrganizations htjo 
              where htjo.Position = (select pos.POSITION from SPADA.dbo.M_POSITION pos 
               where pos.SYSID = @positionid) or htjo.Position = 
                (select pos2.[DESCRIPTION] from SPADA.dbo.M_POSITION pos2 
                 where pos2.SYSID = @positionid)), 
     1, 1, 2, 2) 
     fetch next from cc_cur 
     into @lname, @mname, @fname, @emp_id, 
      @gender, @bday, @allowance, @emp_sysid, 
      @datehired, @status, @positionid 
    end 
    close cc_cur 
    deallocate cc_cur 
if @@ERROR <> 0 
rollback tran @trans_name 
commit tran @trans_name 

如果我设置IDENTITY_INSERT对..标识列仅产生1。

值这是我的表结构

USE [SPADA_FIS] 
GO 

/****** Object: Table [dbo].[HRIS_EmployeeStatus] Script Date: 03/07/2012 17:13:03 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[HRIS_EmployeeStatus](
    [EmployeeStatusID] [int] IDENTITY(1,1) NOT NULL, 
    [EmployeeID] [int] NULL, 
    [EmploymentTypeID] [int] NULL, 
    [DepartmentID] [int] NULL, 
    [EmploymentTenureID] [int] NULL, 
    [Remarks] [varchar](max) NULL, 
    [DateHired] [datetime] NULL, 
    [JobOrganizationID] [int] NULL, 
    [SectionID] [int] NULL, 
    [EmploymentStatusID] [int] NULL, 
    [IsCurrent] [bit] NULL, 
    [StartDate] [datetime] NULL, 
    [IsUnionMember] [bit] NULL, 
    [EndDate] [datetime] NULL, 
    [PayFrequencyID] [int] NULL, 
    [TaxExemptionStatus] [bigint] NULL, 
    [IDNumber] [varchar](50) NULL, 
    [BiometricNumber] [varchar](50) NULL, 
    [BankAccountNumber] [varchar](50) NULL, 
    [CreatedBy_UserID] [int] NULL, 
    [CreatedDate] [datetime] NULL, 
    [UpdatedBy_UserID] [int] NULL, 
    [UpdatedDate] [datetime] NULL, 
CONSTRAINT [PK_HRIS_EmployeeStatus] PRIMARY KEY CLUSTERED 
(
    [EmployeeStatusID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_EmployeeID] DEFAULT ((0)) FOR [EmployeeID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_EmploymentTypeID] DEFAULT ((0)) FOR [EmploymentTypeID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_DepartmentID] DEFAULT ((0)) FOR [DepartmentID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_EmploymentTenureID] DEFAULT ((0)) FOR [EmploymentTenureID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_DateHired] DEFAULT (getdate()) FOR [DateHired] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_JobOrganizationID] DEFAULT ((0)) FOR [JobOrganizationID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_SectionID] DEFAULT ((0)) FOR [SectionID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_EmploymentStatusID] DEFAULT ((0)) FOR [EmploymentStatusID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_IsCurrent] DEFAULT ((1)) FOR [IsCurrent] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_StartDate] DEFAULT (getdate()) FOR [StartDate] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_IsUnionMember] DEFAULT ((0)) FOR [IsUnionMember] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_EndDate] DEFAULT (getdate()) FOR [EndDate] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_PayFrequencyID] DEFAULT ((0)) FOR [PayFrequencyID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_TaxExemptionStatus] DEFAULT ((0)) FOR [TaxExemptionStatus] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_CreatedBy_UserID] DEFAULT ((0)) FOR [CreatedBy_UserID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_UpdatedBy_UserID] DEFAULT ((0)) FOR [UpdatedBy_UserID] 
GO 

ALTER TABLE [dbo].[HRIS_EmployeeStatus] ADD CONSTRAINT [DF_HRIS_EmployeeStatus_UpdatedDate] DEFAULT (getdate()) FOR [UpdatedDate] 
GO 
+0

在插入时没有提及'@ emp_id',只需命名所有其他列,然后将自动创建ID值。 – Seph 2012-03-07 08:59:41

+0

只有在您想显式为标识列提供值时,才需要启用Identity_insert。通常你想让它自动分配。你还没有提供架构来说明你正在尝试在标识列中插入值的标识列 – kaj 2012-03-07 09:00:23

+1

,这就是为什么它正在发生 – Nighil 2012-03-07 09:01:14

回答

3

那是你的问题:你有:

CREATE TABLE [dbo].[HRIS_EmployeeStatus](
    [EmployeeStatusID] [int] IDENTITY(1,1) NOT NULL, 

,并在您INSERT声明,您要的东西插入到该列:

insert into SPADA_FIS.dbo.HRIS_EmployeeStatus 
     (EmployeeID, EmploymentTypeID, DepartmentID, EmploymentTenureID, 
     Remarks, DateHired, JobOrganizationID, EmployeeStatusID, IsCurrent, 
               ***************** 
     PayFrequencyID, TaxExemptionStatus) 

不要那样做! IDENTITY列将由SQL Server自身处理。请从INSERT声明中删除该列(以及VALUES集合中的值),并且您应该没问题。

+1

比我早4秒:) – b0rg 2012-03-07 09:33:52

1

看来你是试图在标记为'identity'列的列中插入一个值。因此你会得到错误。插入新行时,服务器会自动生成标识列值。如果你想明确地插入值,则需要将“identity_insert”属性设置为“真”这样的列

0

啊,好老的人力资源数据库,几乎像教科书中......你会因为它的定义为

[EmployeeStatusID] [int] IDENTITY(1,1) NOT NULL, 

所以将需要删除“EmployeeStatusId”从

insert into SPADA_FIS.dbo.HRIS_EmployeeStatus... 

在插入时自动生成。

0

为已经提供的答案并不明确地为员工提供StatusId

的值作为单独的点你应该砸EmployeeStatusId

默认约束

你不应该能够创建一个默认约束一个标识列...

相关问题