我試圖寫在SQL Server 2008 R2的存儲過程,將做到以下幾點:錯誤在SQL Server中使用合併(使用OpenQuery和鏈接服務器)
- 創建臨時表
- 執行基於一個(甲骨文) 插入OPENQUERY選擇來填充臨時表
- 合併並更新臨時表的內容與現有的表
然而,UPO ñ嘗試它我得到一個錯誤,我想知道如果我真的正在這個正確的方式。
的過程如下:
ALTER PROCEDURE [dbo].[SyncHealthMainStudRec]
AS
BEGIN
SET NOCOUNT ON
create table #SyncHealthMainStudRecTemp(
[HEALTHMAINSTUDRECIDID] [int] NOT NULL,
[SCHOOLNUMBER] [int] NOT NULL,
[STUDENTID] [int] NOT NULL,
[WHOCREATED] [nvarchar](100) NULL,
[WHENCREATED] [datetime] NULL,
[WHOMODIFIED] [nvarchar](100) NULL,
[WHENMODIFIED] [datetime] NULL,
[PSGUID] [varchar](50) NULL,
)
end
begin
insert into #SyncHealthMainStudRecTemp
select * from openquery(psdb,
'select
h.healthmainstudrecid,
h.schoolnumber,
h.studentid,
h.whocreated,
h.whencreated,
h.whomodified,
h.whenmodified,
h.psguid
FROM PS.HealthMainStudRec H ')
--select * from #SyncHealthMainStudRecTemp
MERGE INTO HealthMainStudRec H
USING #SyncHealthMainStudRecTemp S
ON (H.HealthMainStudRecid = S.HealthMainStudRecid)
WHEN NOT MATCHED BY TARGET
THEN INSERT(healthmainstudrecid, schoolnumber, studentid, whocreated, whencreated,
whomodified, whenmodified, psguid, D_LastSynced)
VALUES(s.healthmainstudrecid, s.schoolnumber, s.studentid, s.whocreated, s.whencreated,
s.whomodified, s.whenmodified, s.psguid, getdate())
WHEN MATCHED and (
isnull(H.whocreated,'') collate SQL_Latin1_General_CP1_CS_AS <> isnull(S.whocreated,'') collate SQL_Latin1_General_CP1_CS_AS or
isnull(H.whencreated,'') <> isnull(S.whencreated,'') or
isnull(H.whomodified,'') collate SQL_Latin1_General_CP1_CS_AS <> isnull(S.whomodified,'') collate SQL_Latin1_General_CP1_CS_AS or
isnull(H.whenmodified,'') <> isnull(S.whenmodified,'') or
isnull(H.psguid,'') <> isnull(s.psguid,'')
)
THEN UPDATE SET H.whocreated = S.whocreated,
H.whencreated = S.whencreated,
H.whomodified = S.whomodified,
H.whenmodified = S.whenmodified,
H.psguid = S.psguid,
H.D_LastSynced = getdate();
--OUTPUT $action, inserted.*, deleted.*;
drop table SyncHealthMainStudRecTemp
END
而且目前我收到的錯誤是:
Msg 207, Level 16, State 1, Procedure SyncHealthMainStudRec, Line 38
Invalid column name 'healthmainstudrecid'.
「healthmainstudrecid」列中明確存在於目標表,但我無論如何不確定哪個表實際上是指(源/目標)。我無法查詢臨時表以確定它是否已成功創建。
任何幫助將不勝感激。
編輯:這也可能是值得一提的是,在SSMS,這條線紅色下劃線:
MERGE INTO HEALTHMAINSTUDREC H
隨着消息:
Invalid object name 'HEALTHMAINSTUDREC'.
啊!謝謝你,愚蠢的錯誤。我修復了所有雙ID,但仍然收到此錯誤: '消息207,級別16,狀態1,過程SyncHealthMainStudRec,行38 無效的列名稱'HEALTHMAINSTUDRECID'。 (1 row(s)affected)' – Tommen 2015-03-31 06:56:50
檢查,如果PS.HealthMainStudRec列healthmainstudrecid。 檢查HealthMainStudRec是否有column healthmainstudrecid – 2015-03-31 07:22:57
在插入#SyncHealthMainStudRecTemp之前刪除'end begin' – 2015-03-31 07:26:16