我正在創建一個新的SSIS 2008 ETL報表,它將從SQL Server讀取數據並將其附加到ACCESS 2010數據庫表中。當Access表中存在標識列時,如何將記錄附加到現有的訪問表中?SSIS 2008:將SQL數據導出到Access數據庫2010表
我目前的解決方案有一個SQL讀取數據的OLE DB源。它連接到數據轉換任務,然後連接到OLE DB目標任務。訪問表中的標識字段被命名爲「Id」,並且它是一個自動編號字段。
當Access表爲空時,我可以使用OLE DB目標插入值。問題與身份字段以及表中已有記錄的時間有關。
所以,問題是,我的Id列總是從1開始,這意味着我得到一個錯誤,因爲引擎認爲我想插入一個重複密鑰。
我創建了一個SQL Task,它從表中讀取最大ID並將其存儲到一個變量中,但現在我試圖弄清楚如何在數據流導出過程中使用此值。
有人請告訴我如何在表中已有記錄時將數據插入到Access數據庫中?
編輯的清晰度。我添加了下面用來獲取所需SQL記錄的SQL。請注意,我不包括我的SQL中的ID標識字段:
DECLARE @STARTDATE DATETIME = (SELECT CONVERT(VARCHAR(25),DATEADD(DD,-(DAY(DATEADD(MM,4,GETDATE()))-1),
DATEADD(MM,4,GETDATE())),101))
DECLARE @ENDDATE DATETIME = (SELECT CONVERT(VARCHAR(25),DATEADD(DD,-(DAY(DATEADD(MM,5,GETDATE()))),
DATEADD(MM,5,GETDATE())),101))
SELECT DISTINCT
ISNULL(CONVERT(VARCHAR(3),PP.LOBCD),'CPP') 'LOB_Name_Product'
, POLICYID 'Policy_#'
, P.PRODUCERID 'Agent_#'
, CONVERT(VARCHAR(14),POLICYEFFDT,101) 'Policy_Eff_Date'
, CONVERT(VARCHAR(14),TS.POLICYEXPDT,101) 'Policy_Exp_Date'
, CONVERT(NUMERIC(15,2),TS.TERMPREMAMT) 'Inforce_Prem_Sum'
, REPLACE(CONVERT(CHAR(100),REPLACE(REPLACE(N.INSUREDNM,CHAR(10),' '),CHAR(13),'')),',',' ') AS 'Insured_Name'
, REPLACE(P.PRODUCERNM1TX,',',' ') AS 'Agent_Name'
, PD.PREDSTATECD 'Policy_State'
, REPLACE(II.ADDRLINE1TX ,',',' ') AS 'Insured_Address_1'
, REPLACE(ISNULL(II.ADDRLINE2TX,''),',',' ') AS 'Insured_Address_2'
, II.CITYNM 'Insured_City'
, II.STATECD 'Insured_State'
, CASE WHEN LEN(RTRIM(II.ZIPCD)) > 5 THEN (SUBSTRING(II.ZIPCD,1,5) + '-' + SUBSTRING(II.ZIPCD,6,5))
ELSE II.ZIPCD
END 'Insured_Zip'
, REPLACE(P.PRODUCERADDRLINE1TX,',',' ') AS 'Agent_Address_1'
, REPLACE(ISNULL(P.PRODUCERADDRLINE2TX,''),',',' ') AS 'Agent_Address_2'
, P.PRODUCERCITYNM 'Agent_City'
, P.STATECD 'Agent_State'
, CASE WHEN LEN(RTRIM(P.ZIPCD)) > 5 THEN SUBSTRING(RTRIM(P.ZIPCD),1,5) + '-' + SUBSTRING(RTRIM(P.ZIPCD),6,5)
ELSE P.ZIPCD
END 'Agent_Zip'
, CONVERT(VARCHAR(10), GETDATE(), 101) AS 'Upload_Date'
, 'Open' AS 'Status'
FROM COPOLICYPOINTER PP
JOIN COTRANSACTIONSUMMARY TS ON TS.SYSTEMASSIGNID = PP.SYSTEMASSIGNID
AND TS.TRANSSEQNO = ( SELECT MAX(TRANSSEQNO) FROM COTRANSACTIONSUMMARY TS2
WHERE TS2.SYSTEMASSIGNID = TS.SYSTEMASSIGNID)
AND TS.TRANSEFFDT = ( SELECT MAX(TRANSEFFDT) FROM COTRANSACTIONSUMMARY TS2
WHERE TS2.SYSTEMASSIGNID = TS.SYSTEMASSIGNID)
JOIN COPOLICYDETAIL PD ON TS.SYSTEMASSIGNID = PD.SYSTEMASSIGNID
AND PD.TRANSSEQNO = ( SELECT MAX(TRANSSEQNO) FROM COPRODUCER PD2
WHERE PD2.SYSTEMASSIGNID = PD.SYSTEMASSIGNID)
JOIN COPRODUCER P ON P.SYSTEMASSIGNID = TS.SYSTEMASSIGNID
AND P.TRANSSEQNO = ( SELECT MAX(TRANSSEQNO) FROM COPRODUCER P2
WHERE P2.SYSTEMASSIGNID = P.SYSTEMASSIGNID)
JOIN COINSUREDNAME N ON N.SYSTEMASSIGNID = P.SYSTEMASSIGNID
AND N.TRANSSEQNO = ( SELECT MAX(TRANSSEQNO) FROM COINSUREDNAME N2
WHERE N2.SYSTEMASSIGNID = N.SYSTEMASSIGNID)
JOIN COINSUREDINFO II ON II.SYSTEMASSIGNID = N.SYSTEMASSIGNID
AND II.TRANSSEQNO = ( SELECT MAX(TRANSSEQNO) FROM COINSUREDINFO I2
WHERE I2.SYSTEMASSIGNID = II.SYSTEMASSIGNID)
WHERE TS.POLICYEXPDT BETWEEN @STARTDATE AND @ENDDATE
AND PP.CANCEFFDT IS NULL
AND PD.PREDSTATECD IN ('CT', 'RI', 'GA','NH','NY')
ORDER BY POLICYID
結果與數據轉換任務相關聯。
數據轉換任務然後鏈接到OLE DB目標任務。
OLE DB目標任務使用連接到Access數據庫的OLE DB提供程序。這個數據庫中的一個表稱爲MasterTable,它有一個名爲ID的自動編號字段。
我添加了下面整個工作流程的屏幕截圖。
- 高級別數據流
我的理解是,關閉自動編號是不可能的。自動編號是Access中的一個字段類型,不像SQL Server中的整數列那樣。 –
是的,先生,謝謝你的答覆。但是必須有某種獲取記錄的方式,將當前標識值添加到我的SQL中,然後將記錄附加到訪問表中?這不可能是第一次出現這個問題。 :) – WorkJ
即使有所有的解釋,目前還不清楚你想用自動編號字段做什麼。 1)您不需要在INSERT(即附加)查詢中指定自動編號字段。它將自動填入下一個有效的號碼。 2)但是,如果您試圖在該自動編號字段中輸入特定值,那麼爲什麼首先將其作爲自動編號字段?如果值通過「轉換任務」形成SQL Server,則將這些值插入標準數字字段(例如,非自動編號,長)。 –