SQL 服务器存储过程从链接服务器插入 table 并使用最大 ID 更新另一个 table

SQL Server stored procedure insert into table from linked server and update another table with max ID

我有一个存储过程可以查询链接服务器并执行插入到本地 table。我想存储我插入的数据中的 max(RID),这样我就可以使用 tableL 中的 RID 作为我下一个 运行.

的指针

我不能使用 SCOPE_IDENTITY(),因为我不打算存储我本地的身份列,但我想存储来自链接 table.[=19 的 max(RID) =]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE OR ALTER PROCEDURE [dbo].[procedure_name]

    DECLARE @RID INT 
AS
BEGIN
   INSERT INTO tableA (RID, Name)
       SELECT * 
       FROM OPENQUERY(linkname, 'SELECT RID, Name FROM linktable WHERE RID > @RID')
END

TableA(ID为顺序PK)

    | ID | RID | Name |
    |----|-----|------|

TableL(ID为顺序PK)

    | ID | RID | Time |
    |----|-----|------|

注意:我发帖后意识到不能将变量传递给 OPENQUERY,所以我将其更改为直接查询。根据您的使用情况,这可能没问题。

我个人是临时 tables 的粉丝,所以我可能会这样做:

-- Get the RID of the last successful run for this table
DECLARE @LastRID int = 0;
SELECT @LastRID = LastRID
FROM dbo.SomeETLTrackingTable
WHERE TableName = 'linktable';

-- Pull the data from linkname over to this server
SELECT RID, [Name]
INTO #data
FROM linkname.linkdb.dbo.linktable
WHERE RID > @LastRID;

-- Insert the data we pulled
INSERT INTO tableA ([Name])
SELECT [Name]
FROM #data;

-- Get the max RID of the batch
SELECT @LastRID = MAX(RID)
FROM #data;

-- Update our ETL tracking table
UPDATE e SET e.LastRID = @LastRID
FROM dbo.SomeETLTrackingTable e
WHERE e.TableName = 'linktable';

注意:我不包括任何交易或错误处理,但您应该确保仅在成功导入后更新跟踪 table。


我还建议您学习 ETL 数据的其他方法。我不会说你所做的是错误的,因为它对许多应用程序来说工作得很好。但是,如果您将来尝试执行更复杂的 ETL 过程,那么了解您还有哪些其他选择将大有裨益。

我只想说出几个,因为那里有很多东西: