当从SQL Server中的另一个表中插入一个表数据时,绕过重复记录

问题描述:

我试图从一个数据库表向另一个数据库表中插入数据。这项工作表现得非常好,但需要绕过重复数据无法插入。下面是我的查询。我如何检查重复记录?当从SQL Server中的另一个表中插入一个表数据时,绕过重复记录

;WITH ABC AS (
    SELECT 
    5 AS DeviceID 
    , nUserID AS CardNo 
    , CONVERT(DATE, dbo.fn_ConvertToDateTime(nDateTime)) AS InOutDate 
    , CONVERT(VARCHAR(8) ,CONVERT(TIME,dbo.fn_ConvertToDateTime(nDateTime))) AS InOutTime 
    FROM [BioStar].[dbo].[TB_EVENT_LOG] 
) 
SELECT * INTO #tempAtten FROM ABC 

INSERT [HR].[dbo].[HR_DeviceInOut](DeviceID, CardNo, InOutDate, InOutTime, ShiftprofileID, ExecutedBy) 
SELECT DeviceID, CardNo, InOutDate, InOutTime, NULL, NULL 
FROM #tempAtten 
WHERE #tempAtten.InOutDate = CONVERT(DATE, GETDATE()) AND #tempAtten.CardNo <> 0 

DROP TABLE #tempAtten 

--HR_DeviceInOut

CREATE TABLE [dbo].[HR_DeviceInOut](
    [id] [bigint] IDENTITY(100000000000001,1) NOT NULL, 
    [DeviceID] [nvarchar](20) NULL, 
    [CardNo] [nvarchar](20) NOT NULL, 
    [InOutDate] [date] NOT NULL, 
    [InOutTime] [nvarchar](10) NOT NULL, 
    [ShiftprofileID] [tinyint] NULL, 
    [ExecutedBy] [int] NULL, 
CONSTRAINT [PK_HR_AttenHistory] PRIMARY KEY CLUSTERED 
(
    [id] 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 

--Function

ALTER FUNCTION [dbo].[fn_ConvertToDateTime] (@Datetime BIGINT) 
RETURNS DATETIME 
AS 
BEGIN 
    DECLARE @LocalTimeOffset BIGINT 
      ,@AdjustedLocalDatetime BIGINT; 
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE()) 
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset 
    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime))) 
END; 
+0

您应该发布'HR_DeviceInOut'表的表结构。该表的主键是什么? – sgeddes

+0

@sgeddes,我已经更新了我的表格结构。 – Shohel

+0

哦,你的查询没有错误,你只是不想插入重复的行。如果是这样,什么定义重复?重复插入或现有数据被复制?也许“不存在”,或者可能是一些带有“row_number”的子查询。 – sgeddes

假设我理解正确的话,这是一个使用not exists一个选项:

INSERT [HR].[dbo].[HR_DeviceInOut] (DeviceID, CardNo, InOutDate, 
            InOutTime, ShiftprofileID, ExecutedBy) 
SELECT DeviceID, CardNo, InOutDate, InOutTime, NULL, NULL 
FROM #tempAtten t 
WHERE t.InOutDate = CONVERT(DATE, GETDATE()) AND 
    t.CardNo <> 0 AND 
    NOT EXISTS (
     SELECT 1 
     FROM [HR].[dbo].[HR_DeviceInOut] d 
     WHERE t.DeviceID = d.DeviceId AND 
       t.CardNo = d.CardNo AND 
       t.InOutDate = d.InOutDate AND 
       t.InOutTime = d.InOutTime 
    ) 

考虑将一个unique_index添加到那些不能重复的字段中。

哪一列集作记录独一无二的,因为我看到了一些列是硬编码

即5 AS的DeviceID ...

在临时表中创建列的其余唯一键和destinationtabel.to避免重复。