标识列不起作用

时间:2012-03-07 08:55:57

标签: sql sql-server-2008 identity-column

我遇到有关身份的特定表格插入记录的问题。但SQL总是告诉我,我需要启用identity_insert,但我已经为该表设置了标识列,这样我确定它不会产生多个id。顺便说一下,我的桌子已经有了记录。这是我的代码

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设置为on ..标识列仅生成值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

4 个答案:

答案 0 :(得分: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 :(得分:1)

您似乎正在尝试在标记为“identity”列的列中插入值。因此你得到了错误。插入新行时,服务器会自动生成标识列值。

如果您想明确插入此类列的值,则需要将“identity_insert”属性设置为“true”

答案 2 :(得分:0)

啊,好老的人力资源数据库,几乎就像在教科书中......你需要从

中删除'EmployeeStatusId'
insert into SPADA_FIS.dbo.HRIS_EmployeeStatus...

因为它被定义为

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

所以它会在插入时自动生成。

答案 3 :(得分:0)

已经提供的答案不是为Employee StatusId

明确提供值

作为一个单独的点,您应该删除EmployeeStatusId上的默认约束

您应该无法在标识列上创建默认约束...