首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态地将数据从一个数据库传输到另一个数据库

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

Stack Overflow用户
提问于 2022-01-13 04:15:07
回答 1查看 287关注 0票数 0

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

我想编辑问题

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

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

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

代码语言:javascript
运行
复制
    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中传递的动态,因为我试图这样写它,我得到了一个错误

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-01-13 04:54:48

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

代码语言:javascript
运行
复制
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;

请注意以下事项:

through

  • Object

  • 使用QUOTENAME正确转义数据库名

  • 使用nvarchar(max)存储动态SQL

  • 使用sp_executesql传递参数@id_id所有的方式都应该存储为sysname

  • Do而不是使用sp_作为过程前缀,它保留给系统过程H 217F 218
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70691340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档