【问题标题】:SQL Server : IF EXIST update or insert between similar database tablesSQL Server:IF EXIST 在相似的数据库表之间更新或插入
【发布时间】:2016-09-27 09:26:21
【问题描述】:

我想使用一个简单的代码来更新或插入两个相似数据库之间的记录。

A数据库中有一个这样的表:

CREATE TABLE [dbo].A.[tblDuyurular]
(
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [SiteID] [int] NOT NULL,
        [Dil] [varchar](7) NULL,
        [DuyuruBaslik] [varchar](250) NOT NULL,
        [DuyuruIcerik] [varchar](max) NOT NULL
)

B数据库中:

CREATE TABLE [dbo].B.[TBLDuyurular]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [fakulteID] [int] NOT NULL,
    [DuyuruBaslik] [varchar](250) NOT NULL,
    [DuyuruIcerik] [varchar](max) NOT NULL,
    [dil] [varchar](7) NULL
)

匹配的列是:

ID = ID,
SiteID = fakulteID,
Dil = dil,
DuyuruBaslik = DuyuruBaslik,
DuyuruIcerik = DuyuruIcerik,

我想查看 dbo.B.TBLDuyurular 记录。如果 dbo.A.tblDuyurular 中存在记录,则使用 dbo.B.TblDuyurular 的结果更新 dbo.A.tblDuyurular。如果 dbo.A.tblDuyurular 中不存在记录,则将 dbo.B.TBLDuyurular 的结果插入 dbo.A.tblDuyurular。表列被最小化。这些表中的列太多。

这种情况最好的方法是什么?

请帮忙。谢谢。

【问题讨论】:

  • 使用合并语句。

标签: sql sql-server database sql-server-2008


【解决方案1】:

尝试合并;

MERGE [dbo].A.[tblDuyuyular] AS TARGET
USING [dbo].B.[tblDuyuyular] AS SOURCE
ON TARGET.ID = SOURCE.ID 
AND TARGET.SiteID  = SOURCE.fakulteID 
AND TARGET.Dil  = SOURCE.dil
AND TARGET.DuyuruBaslik  = SOURCE.DuyuruBaslik 
AND TARGET.DuyuruIcerik  = SOURCE.DuyuruIcerik 
WHEN MATCHED
THEN UPDATE TARGET.SiteID  = SOURCE.fakulteID, TARGET.Dil  = SOURCE.dil, TARGET.DuyuruBaslik  = SOURCE.DuyuruBaslik, TARGET.DuyuruIcerik  = SOURCE.DuyuruIcerik -- Add Other Columns
WHEN NOT MATCHED
THEN INSERT(TARGET.SiteID, TARGET.Dil, TARGET.DuyuruBaslik, TARGET.DuyuruIcerik) VALUES(SOURCE.fakulteID, SOURCE.dil, SOURCE.DuyuruBaslik, SOURCE.DuyuruIcerik) -- Add Other Columns

如果您想在 SOURCE 中保持不匹配的 ID 与 TARGET 表相同,请按照此操作;

SET IDENTITY_INSERT [dbo].A.[tblDuyuyular] ON;
GO

MERGE [dbo].A.[tblDuyuyular] AS TARGET
USING [dbo].B.[tblDuyuyular] AS SOURCE
ON TARGET.ID = SOURCE.ID 
AND TARGET.SiteID  = SOURCE.fakulteID 
AND TARGET.Dil  = SOURCE.dil
AND TARGET.DuyuruBaslik  = SOURCE.DuyuruBaslik 
AND TARGET.DuyuruIcerik  = SOURCE.DuyuruIcerik 
WHEN MATCHED
THEN UPDATE TARGET.SiteID  = SOURCE.fakulteID, TARGET.Dil  = SOURCE.dil, TARGET.DuyuruBaslik  = SOURCE.DuyuruBaslik, TARGET.DuyuruIcerik  = SOURCE.DuyuruIcerik -- Add Other Columns
WHEN NOT MATCHED
THEN INSERT(TARGET.ID, TARGET.SiteID, TARGET.Dil, TARGET.DuyuruBaslik, TARGET.DuyuruIcerik) VALUES(SOURCE.ID, SOURCE.fakulteID, SOURCE.dil, SOURCE.DuyuruBaslik, SOURCE.DuyuruIcerik); -- Add Other Columns

SET IDENTITY_INSERT [dbo].A.[tblDuyuyular] OFF;
GO

对于任何条件,将第二行更改如下

USING 
(
SELECT * FROM [dbo].B.[tblDuyuyular] WHERE 'YOUR CONDITION' = 'YOUR CONDITION'
)
AS SOURCE

【讨论】:

  • 非常感谢您的回复。如何解决自动增量字段问题。这是一些 ID 号:27019 27026 27034 34275 34737 34770 34780 34796。我使用的是 sql server 2008 r2。
  • 对于插入自动标识列将自动创建,相对于最大值递增 1。您无需提供值。如果你想在 SOURCE 中插入与 TARGET 相同的 ID,我认为这是不匹配的。
  • 实现这一目标的一种方法。禁用标识插入到 SOURCE 表,然后插入 ID 值。合并后,您可以再次启用身份插入到 SOURE 表。
  • 工作!谢谢。我可以在这段代码中添加 where 子句吗?
【解决方案2】:

你可以试试 Merge 语句

MERGE dbo.A.tblDuyurular as target
using dbo.B.tblDuyurular as source ON 
  ON  target.ID = source.ID,
  and target.SiteID = source.fakulteID,
  and target.Dil = source.dil,
  and target.DuyuruBaslik = source.DuyuruBaslik,
  and target.DuyuruIcerik = source.DuyuruIcerik,
WHEN matched THEN Update
  SET target.yourfields = source.yourfields
WHEN NOT MATCHED BY TARGET THEN insert (yourfields) values(source.yourfields)

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2011-02-16
    • 1970-01-01
    • 2023-03-19
    • 2015-09-05
    • 1970-01-01
    • 2017-09-19
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多