将 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
我有两个数据库实例,需要在它们之间传输数据。我想在存储过程中完成。是否可以将目标 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