动态地将数据从一个数据库传输到另一个数据库



感谢您帮助我解决在3个数据库(同一服务器(之间传输数据的问题。

我想编辑问题

假设我有3个数据库:Data1、Data2和Data3。

在这些数据中有相同的表和列。

现在我使用这个命令,它工作正常

CREATE PROCEDURE [dbo].[copy]
@id_id INT,
@namecreate Nvarchar(50),
@txtdataname sysname
AS BEGIN

DECLARE @InsertedRows TABLE (id INT)

--Insert Master
insert into [Data2].[dbo].[Table1] (cot1, cot2, cot3, cot4, namecreate) 

OUTPUT inserted.id        
INTO @InsertedRows

SELECT cot1, cot2, cot3, cot4, @namecreate From Table1 WHERE (id = @id_id)                      

--Insert Detail
insert into [Data2].[dbo].[Table2] (id, cot1, cot2, cot3, cot4) 
SELECT (SELECT TOP (1) id FROM @InsertedRows), cot1, cot2, cot3, cot4 From Table2 WHERE (id = @id_id)

END

我想把Data2的位置改为在@txtdataname中传递的动态因为我试着这样写,我得到了一个错误

CREATE PROCEDURE [dbo].[copy]
@id_id INT,
@namecreate Nvarchar(50),
@txtdataname sysname
AS BEGIN

DECLARE @InsertedRows TABLE (id INT)

--Insert Master
insert into [@txtdataname].[dbo].[Table1] (cot1, cot2, cot3, cot4, namecreate) 

OUTPUT inserted.id        
INTO @InsertedRows

SELECT cot1, cot2, cot3, cot4, @namecreate From Table1 WHERE (id = @id_id)                      

--Insert Detail
insert into [@txtdataname].[dbo].[Table2] (id, cot1, cot2, cot3, cot4) 
SELECT (SELECT TOP (1) id FROM @InsertedRows), cot1, cot2, cot3, cot4 From Table2 WHERE (id = @id_id)

END

不能将变量名用作对象引用的一部分。为此,您需要使用动态SQL。

CREATE OR ALTER PROCEDURE [dbo].[copy]
@id_id INT,
@txtdataname sysname
AS
DECLARE @sql nvarchar(max) = '
insert into ' + QUOTENAME(@txtdataname) + '.[dbo].[Table1] (cot1, cot2, cot3, cot4)
SELECT cot1, cot2, cot3, cot4
From Table1
WHERE (id = @id_id);
';
EXEC sp_executesql @sql,
N'@id_id int',
@id_id = @id_id;

注意以下内容:

  • 使用QUOTENAME正确转义数据库名称
  • 使用nvarchar(max)存储动态SQL
  • 使用sp_executesql始终传递参数@id_id
  • 对象名称应始终存储为sysname
  • 不要使用sp_作为过程前缀,它是为系统过程保留的

最新更新