将 table 和数据库服务器传递给存储过程

Pass table and database server to stored procedure

我有两个数据库实例,需要在它们之间传输数据。我想在存储过程中完成。是否可以将目标 table(和数据库实例)作为参数传递给存储过程?

我成功了:

INSERT INTO [SERVER1].[MYSCHEMA1].[TargetTable]
    ([ID], [Timestamp])
SELECT 
    [ID], [Timestamp]
FROM [SERVER2].[MYSCHEMA2].[SourceTable]
WHERE ID= @SomeId

但我想做这样的事情:

CREATE PROCEDURE spDoStuff
    -- Add the parameters for the stored procedure here
     @id uniqueidentifier,
     @server nvarchar(100),
     @table nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO [SERVER1].[MYSCHEMA1].[TargetTable]
        ([ID], [Timestamp])
    SELECT 
        [ID], [Timestamp]
    FROM @server.@table.[SourceTable]
    WHERE ID= @id
END

我知道可以用动态 SQL 来完成,但我想尽可能避免它。我也读过 TVP,但我不确定这是否真的有必要,因为它也需要我在代码中设计 table。这将从 Entity Framework Core 2.2.

调用

为了完成,我会这样写你的 SP:

CREATE PROCEDURE spDoStuff
    -- Add the parameters for the stored procedure here
     @id uniqueidentifier,
     @server sysname,
     @table sysname
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQL nvarchar(MAX);
    SET @SQL = N'INSERT INTO [SERVER1].[MYSCHEMA1].[TargetTable]' + NCHAR(13) + NCHAR(10) +
               N'    ([ID], [Timestamp])' + NCHAR(13) + NCHAR(10) +
               N'SELECT [ID], [Timestamp]' + NCHAR(13) + NCHAR(10) +
               N'FROM ' + QUOTENAME(@server) + N'.' + QUOTENAME(@table) + N'.SourceTable' + NCHAR(13) + NCHAR(10) + --Seems Odd should @Table actually be @database?
               N'WHERE ID = @ID;';

    EXEC sp_executesql @SQL, N'@id uniqueidentifier', @id = @id;
END