2017-12-03 8 views
0

시간이 흐른 아래 스크립트가 있는데 수정이 필요합니다. 스크립트는 매일 2 ~ 3 회 실행되어 테이블에서 데이터를 가져옵니다. 일부 데이터는 복제 될 수 있으며 원하는 것은 수정 된 스크립트가 데이터가 존재하지 않는 경우에만 가져오고 테이블에 기록한다는 것입니다.존재하지 않는 데이터가 포함 된 SQL Server 테이블 업데이트

누군가가 데이터 병합을 시도하거나 위치가 존재하지 않는다고 말했습니다.

불행히도 저는 어떻게 구현할 것인지 잘 모르겠습니다. 따라서 저는 여러분 모두에게 도움을 청했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

BEGIN TRY 
BEGIN TRANSACTION 
Declare @Date As DATE 

IF OBJECT_ID('Tempdb..#1','U') IS NOT NULL 
DROP TABLE #1 

SELECT [EMP_ID],[NAME],[DEPT],[DATE],[Start Time],[LOGIN],[LATE/AWOL],[Team Manager],[Senior Manager],[SITE] 
INTO #1 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
       'Excel 12.0;Database=\\VF_RSOSDCNASUDA\xxx\SQL\ESO\ALLAttendance.xlsm;HDR=YES', 
       'SELECT * FROM [ForEmail$]'); 

SELECT TOP 1 @Date=[DATE] FROM #1 

DELETE [dbo].[ALLAttendance$] WHERE CONVERT(char(10),[Date],102)[email protected]; 

INSERT INTO [dbo].[ALLAttendance$] 
SELECT [EMP_ID],[NAME],[DEPT],[DATE],[Start Time],[LOGIN],[LATE/AWOL],[Team Manager],[Senior Manager],[SITE] 
FROM #1 
DROP TABLE #1 
COMMIT 
END TRY 
BEGIN CATCH 

IF @@TRANCOUNT > 0 
    ROLLBACK 
END CATCH 

***** UPDATE ***** 나는 아래에 와서는이

with CTE 
AS 
(
SELECT [EMP_ID] 
    ,[NAME] 
    ,[DEPT] 
    ,[DATE] 
    ,[Start Time] 
    ,[LOGIN] 
    ,[LATE/AWOL] 
    ,[Team Manager] 
    ,[Senior Manager] 
    ,[SITE] 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
       'Excel 12.0;Database=\\VF_RSOSDCNASUDA\xxx\SQL\ESO\ALLAttendance.xlsm;HDR=YES', 
       'SELECT * FROM [ForEmail$]') 
) 
merge [dbo].[ALLAttendance$] t 
using CTE s 
on s.[EMP_ID] = t.[EMP_ID] 
and s.[NAME] = t.[NAME] 
and s.[DEPT] = t.[DEPT] 
and s.[DATE] = t.[DATE] 
and s.[Start Time] = t.[Start Time] 
and s.[LOGIN] = t.[LOGIN] 
and s.[LATE/AWOL] = t.[LATE/AWOL] 
and s.[Team Manager] = t.[Team Manager] 
and s.[Senior Manager] = t.[Senior Manager] 
and s.[SITE] = t.[SITE] 
when not matched by target 
then insert ([EMP_ID],[NAME],[DEPT],[DATE],[Start Time],[LOGIN],[LATE/AWOL],[Team Manager],[Senior Manager],[SITE]) 
values (s.[EMP_ID],s.[NAME],s.[DEPT],s.[DATE],s.[Start Time],s.[LOGIN],s.[LATE/AWOL],s.[Team Manager],s.[Senior Manager],s.[SITE]); 
+0

올바른 결과를 얻는다면 '올바른'표시기입니다. 'MERGE' 대신에'INSERT' 문으로 같은 결과를 얻을 수 있습니다. IMHO 이것은 더 간단 할 것이나 당신에게 달려 있습니다. –

+0

감사합니다. Nick. 몇 가지 샘플 데이터로 몇 가지 테스트를 완료했으며 예상되는 결과를 얻었습니다. 그래서 나는 좋은 사람이라고 생각한다. – sly123

답변

0

을하는 올바른 방법은 내 최종 있다면 작동하지만, 확실하지 않은 것으로 보인다 문제에 대한 해결책은 다음과 같습니다.

BEGIN TRY 
BEGIN TRANSACTION 
;with CTE 
AS 
(
SELECT [EMP_ID] 
    ,[NAME] 
    ,[DEPT] 
    ,[DATE] 
    ,[Start Time] 
    ,[LOGIN] 
    ,[LATE/AWOL] 
    ,[Team Manager] 
    ,[Senior Manager] 
    ,[SITE] 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
       'Excel 12.0;Database=\\VF_RSOSDCNASUDA\xxx\National_Command\National Command Centre\SQL\ESO\ALLAttendance.xlsm;HDR=YES', 
       'SELECT * FROM [ForEmail$]') 
) 
merge ESO.[dbo].[ALLAttendance$] t 
using CTE s 
on s.[EMP_ID] = t.[EMP_ID] 
and s.[NAME] = t.[NAME] 
and s.[DEPT] = t.[DEPT] 
and s.[DATE] = t.[DATE] 
and s.[Start Time] = t.[Start Time] 
and s.[LOGIN] = t.[LOGIN] 
and s.[LATE/AWOL] = t.[LATE/AWOL] 
and s.[Team Manager] = t.[Team Manager] 
and s.[Senior Manager] = t.[Senior Manager] 
and s.[SITE] = t.[SITE] 
when not matched by target 
then insert ([EMP_ID],[NAME],[DEPT],[DATE],[Start Time],[LOGIN],[LATE/AWOL],[Team Manager],[Senior Manager],[SITE]) 
values (s.[EMP_ID],s.[NAME],s.[DEPT],s.[DATE],s.[Start Time],s.[LOGIN],s.[LATE/AWOL],s.[Team Manager],s.[Senior Manager],s.[SITE]); 
COMMIT 
END TRY 
BEGIN CATCH 

IF @@TRANCOUNT > 0 
    ROLLBACK 
END CATCH