【问题标题】:Transfer data from one database to another dynamically将数据从一个数据库动态传输到另一个数据库
【发布时间】:2022-01-14 15:20:46
【问题描述】:

感谢您帮助我解决在 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 sp_executesql 来做到这一点
  • 对了,标题说的是from one server to another,其实你是transferring data between 3 Databases (same server)
  • 对象名称是 unicode 并且具有特定长度 - 使用 sysname。并且停止使用将“类型”添加到变量名的可怕做法。

标签: sql sql-server


【解决方案1】:

您不能将变量名用作对象引用的一部分。为此,您需要使用动态 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_ 作为过程前缀,它是为系统过程保留的

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2016-07-28
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多