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

时间:2019-03-04 09:44:22

标签: sql sql-server sql-server-2017

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

我正在工作:

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,但是我不确定这是否确实必要,因为它也需要我用代码设计表格。这将从Entity Framework Core 2.2中调用。

1 个答案:

答案 0 :(得分:0)

为完成起见,这就是我编写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