Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如果存在,请在类似数据库表之间更新或插入_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

SQL Server:如果存在,请在类似数据库表之间更新或插入

SQL Server:如果存在,请在类似数据库表之间更新或插入,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我想用一个简单的代码在两个相似的数据库之间更新或插入一条记录 在数据库中有这样一个表: 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, [Du

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

数据库中有这样一个表:

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.tblduyural记录。如果dbo.A.tblduyural中存在记录,则使用dbo.B.tblduyural的结果更新dbo.A.tblduyural。如果dbo.A.tblduyural中不存在记录,请将dbo.B.tblduyural的结果插入dbo.A.tblduyural。表列被最小化。这些表中的列太多

解决这种情况的最佳方法是什么

请帮忙。谢谢。

尝试合并

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
如果您想在源表中保持不匹配的ID与目标表中的ID相同,请遵循以下步骤

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
尝试合并

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
如果您想在源表中保持不匹配的ID与目标表中的ID相同,请遵循以下步骤

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

您可以尝试使用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)

您可以尝试使用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)

使用合并语句。使用合并语句。非常感谢您的回复。如何解决自动递增字段问题。这是一些身份证号码:27019 27026 27034 34275 34737 34770 34780 34796。我使用的是sql server 2008 r2。对于插入,自动标识列将自动创建,最大值为增量1。您不需要提供值。若你们想在源代码和目标代码中插入那个些不匹配的ID,我认为这是不可能的。你们可以用一种方法来实现这一点。禁用对源表的标识插入,然后使用ID值进行插入。合并后,您可以再次启用标识插入到资源表。已成功!,谢谢我可以在代码中添加where子句吗?非常感谢您的回复。如何解决自动递增字段问题。这是一些身份证号码:27019 27026 27034 34275 34737 34770 34780 34796。我使用的是sql server 2008 r2。对于插入,自动标识列将自动创建,最大值为增量1。您不需要提供值。若你们想在源代码和目标代码中插入那个些不匹配的ID,我认为这是不可能的。你们可以用一种方法来实现这一点。禁用对源表的标识插入,然后使用ID值进行插入。合并后,您可以再次启用标识插入到资源表。已成功!,谢谢我可以在代码中添加where子句吗?