在 SQL 服务器(使用 openquery 和链接服务器)中使用 MERGE 时出错
Error using MERGE in SQL Server (with openquery & linked server)
我正在尝试在 SQL Server 2008 R2 中编写一个存储过程,它将执行以下操作:
- 创建一个临时文件table
- 基于 (Oracle) 执行插入
openquery select 填充临时 table
- 合并并更新临时 table 与现有 table
的内容
但是,在尝试时出现错误,我想知道我是否真的以正确的方式处理这个问题。
程序如下:
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。
我正在尝试在 SQL Server 2008 R2 中编写一个存储过程,它将执行以下操作:
- 创建一个临时文件table
- 基于 (Oracle) 执行插入 openquery select 填充临时 table
- 合并并更新临时 table 与现有 table 的内容
但是,在尝试时出现错误,我想知道我是否真的以正确的方式处理这个问题。
程序如下:
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。