2016-08-02 30 views
0

我試圖從一個數據庫表向另一個數據庫表中插入數據。這項工作表現得非常好,但需要繞過重複數據無法插入。下面是我的查詢。我如何檢查重複記錄?當從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

回答

1

假設我理解正確的話,這是一個使用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添加到那些不能重複的字段中。

0

哪一列集作記錄獨一無二的,因爲我看到了一些列是硬編碼

即5 AS的DeviceID ...

在臨時表中創建列的其餘唯一鍵和destinationtabel.to避免重複。

相關問題