从另一个数据库更新表

Mig*_*uel -1 sql-server

我必须从位于另一个数据库中的另一个“table1”更新“table2”。位于另一个数据库中的“table1”每天更新为最后一天的事务。我只想用添加到“table1”中的新值更新“table2”。数据库位于同一台服务器中。

行不会从“table1”中删除,这是我想重放到“table2”中的事务的历史记录,因为“table2”(在同一服务器的另一个数据库中)将用于 SSAS,用于 BI。

我认为这需要一个程序。这是我尝试过的:

USE BDID_BI;
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE TransactionUpdate
AS 
insert [BDID_BI].[dbo].[Transaction] * 
SELECT *
FROM [BDID].[dbo].[hl_transaction] as B
WHERE ( SELECT * FROM [BDID_BI].[dbo].[Transaction]
WHERE date < B.date);
GO
Run Code Online (Sandbox Code Playgroud)

这将是一个日常过程,所以我不必插入之前插入的值,我只需更新添加到“table1”中的新值。

小智 5

假设数据库在同一台服务器上,并且您使用的是默认模式 dbo,您可以编写类似于以下内容的内容:

INSERT INTO [database2].[dbo].[table2] (<add your columns>)
SELECT (<same columns>)
FROM [database1].[dbo].[table1]
Run Code Online (Sandbox Code Playgroud)

如果它们在不同的服务器上,您必须处理将链接服务器添加到其中一台服务器的问题,然后使用四部分命名。


最初是spaghettidba的评论:

假设您在两个表上具有相同顺序的相同列,并且您总是想为较新的日期插入行,则应该这样做:

INSERT INTO [BDID_BI].[dbo].[Transaction] 
SELECT B.* 
FROM [BDID].[dbo].[hl_transaction] as B
WHERE B.[date] > 
( 
    SELECT MAX(A.[date]) 
    FROM [BDID_BI].[dbo].[Transaction] AS A
);
Run Code Online (Sandbox Code Playgroud)

另一条评论,这一次由Kenneth Fisher 发表

上面的方法可行,但您做出了一个重要假设,即您的所有数据都已在该日期加载。如果您在事务表中有一个标识列,我会将其用作您的测试。像这样的东西:

SELECT B.*
FROM [BDID].[dbo].[hl_transaction] as B 
WHERE B.[ID] > 
( 
    SELECT MAX(A.[ID]) 
    FROM [BDID_BI].[dbo].[Transaction] AS A
);
Run Code Online (Sandbox Code Playgroud)

最后,来自SQL Hammer

理想情况下,将是两个表中存在这样你可以使用一个主键LEFT JOIN的方法IF NOT EXISTS

INSERT INTO [BDID_BI].[dbo].[Transaction] 
SELECT B.* 
FROM [BDID].[dbo].[hl_transaction] as B 
LEFT JOIN [BDID_BI].[dbo].[Transaction] AS B_BI 
    ON B.primaryKey = B_BI.primaryKey
WHERE B_BI.primaryKey IS NULL;
Run Code Online (Sandbox Code Playgroud)