繁体   English   中英

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

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

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

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

但是,尝试时出现错误,我想知道我是否真的在以正确的方式进行操作。

步骤如下:

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

2 使用Openquery更新链接服务器

我尝试过此代码,但仍然出现以下错误,也许有人可以帮忙? 链接服务器“ LINK2000”的OLE DB提供程序“ SQLNCLI10”返回消息“多步OLE DB操作生成了错误。检查每个OLE DB状态值(如果可用)。未完成工作。”。 消息16955,第16级,州2,第1行 无 ...

4 SQL链接服务器更新Openquery语法错误

我试图通过链接服务器设置从SQL Server 2008 R2更新PervasiveSQL后端(Sage ERP系统)中的数据。 下面是返回的详细信息和错误消息...踢球者是更新语句适用于开发盒,只是很好,非常相似的设置。 任何帮助将不胜感激! 环境: Windows Ser ...

6 使用链接服务器与 openquery 相比是否有 SQL 性能优势?

我已经做了一些挖掘,但没有明确的答案。 我们有一个服务器处理大约 90% 的所有请求,另外 20 个服务器(大约)处理最后 10%。 我们的大部分 SSRS 请求 ping 这个服务器。 我们也在不断地使用OPENQUERY ping Oracle 服务器,所以我想知道:除了分离另一台服务器之外 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM