我有两个数据库实例,需要在它们之间传输数据。我想在存储过程中做到这一点。是否可以将目标表(和数据库实例)作为参数传递给存储过程?
我正在工作:
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中调用。
答案 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