2012-03-07 10 views
1

アイデンティティに関する特定のテーブルにレコードを挿入する際に問題があります。しかし、SQLは常にidentity_insertをオンにする必要があることを私に教えていますが、すでに複数のIDを生成しないように、そのテーブルのID列を設定しています。ところで私のテーブルにはすでにレコードがあります。私はIDENTITY_INSERTが..にID列が唯一のこれが私のテーブルの構造である1アイデンティティ列が機能しない

の値を生成するために設定した場合、ここに私のコード

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 

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

+0

Identity列の値を明示的に指定する場合は、Identity_insertをオンにする必要があります。通常、自動的に割り当てられるようにします。あなたはID列であると言うスキーマを提供していません – kaj

+1

ID列に値を挿入しようとしている理由が起こっています – Nighil

答えて

3

に「identity_insert」プロパティを設定する必要があり、そのような列の値を挿入したい場合には

あなたのINSERT文は、あなたがその列に何かを挿入しようとしている。

はそれを

insert into SPADA_FIS.dbo.HRIS_EmployeeStatus 
     (EmployeeID, EmploymentTypeID, DepartmentID, EmploymentTenureID, 
     Remarks, DateHired, JobOrganizationID, EmployeeStatusID, IsCurrent, 
               ***************** 
     PayFrequencyID, TaxExemptionStatus) 
しないでください! IDENTITY列はSQL Server自体で処理されます。 INSERTステートメント(および VALUESコレクションの値)からその列を削除しても問題ありません。ほとんどの教科書のようにああ、古き良きHRデータベースは、...あなたが削除する必要があります

+1

私より4秒早く:) – b0rg

1

あなたがしているようです'identity'列としてマークされている列に値を挿入しようとしています。したがって、エラーが発生します。 ID列値は、新しい行を挿入するとサーバーによって自動的に生成されます。あなたが持っている::

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

とで明示的に自分の問題だあなたが「真」

0

「EmployeeStatusId」

insert into SPADA_FIS.dbo.HRIS_EmployeeStatus... 

からそれはそう

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

として定義されていますように、なります挿入時に自動的に生成されます。

0

すでに提供される答えは明示的にあなたは、おそらくあなたはデフォルトを作成できないようにする必要がありEmployeeStatusId

のデフォルトの制約を削除する必要があり、別のポイントとしては、従業員StatusId

の値を提供することではありませんID列の制約...