2015-03-31 103 views
0

我試圖寫在SQL Server 2008 R2的存儲過程,將做到以下幾點:錯誤在SQL Server中使用合併(使用OpenQuery和鏈接服務器)

  1. 創建臨時表
  2. 執行基於一個(甲骨文) 插入OPENQUERY選擇來填充臨時表
  3. 合併並更新臨時表的內容與現有的表

然而,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'. 

回答

1

#SyncHealthMainStudRecTemp有列HEALTHMAINSTUDRECIDID,不healthmainstudrecid。注意雙重ID

insert into #SyncHealthMainStudRecTemp之前刪除end begin

MERGE INTO HealthMainStudRec H 
USING #SyncHealthMainStudRecTemp S 
ON (H.HealthMainStudRecid = S.HEALTHMAINSTUDRECIDID) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(healthmainstudrecid, schoolnumber, studentid, whocreated, whencreated, 
       whomodified, whenmodified, psguid, D_LastSynced) 
     VALUES(s.HEALTHMAINSTUDRECIDID, s.schoolnumber, s.studentid, s.whocreated, s.whencreated, 
       s.whomodified, s.whenmodified, s.psguid, getdate()) 

編輯:

男人你有大小寫敏感歸類:SQL_Latin1_General_CP1_CS_AS。所以你需要在聲明它們時保留表名和列名。 如果表中有列HEALTHMAINSTUDRECID,那麼當您有區分大小寫的排序規則時,您將無法將其稱爲HealthMainStudRecid。

+0

啊!謝謝你,愚蠢的錯誤。我修復了所有雙ID,但仍然收到此錯誤: '消息207,級別16,狀態1,過程SyncHealthMainStudRec,行38 無效的列名稱'HEALTHMAINSTUDRECID'。 (1 row(s)affected)' – Tommen 2015-03-31 06:56:50

+0

檢查,如果PS.HealthMainStudRec列healthmainstudrecid。 檢查HealthMainStudRec是否有column healthmainstudrecid – 2015-03-31 07:22:57

+0

在插入#SyncHealthMainStudRecTemp之前刪除'end begin' – 2015-03-31 07:26:16

相關問題