2017-12-03 13 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

おかげでニック。私はちょうどいくつかのサンプルデータでいくつかのテストを完了し、私は期待される結果を得ました。だから私はいいと思う。 – 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 
関連する問題