在 SQL 服务器(使用 openquery 和链接服务器)中使用 MERGE 时出错

Error using MERGE in SQL Server (with openquery & linked server)

我正在尝试在 SQL Server 2008 R2 中编写一个存储过程,它将执行以下操作:

  1. 创建一个临时文件table
  2. 基于 (Oracle) 执行插入 openquery select 填充临时 table
  3. 合并并更新临时 table 与现有 table
  4. 的内容

但是,在尝试时出现错误,我想知道我是否真的以正确的方式处理这个问题。

程序如下:

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' 肯定存在于目标 table 中,但我不确定无论如何要确认实际上指的是哪个 table (source/target) .我也无法查询临时 table 以确定它是否已成功创建。

如有任何帮助,我们将不胜感激。

编辑:可能还值得一提的是,在 SSMS 中,此行带有红色下划线:

MERGE INTO HEALTHMAINSTUDREC H

附留言:

Invalid object name 'HEALTHMAINSTUDREC'.

#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。因此,您需要在声明时保留 Table 名称和列名称。 如果 table 有 HEALTHMAINSTUDRECIDID 列,当您使用区分大小写的排序规则时,您将无法将其称为 HealthMainStudRecid。