谢谢您帮助我解决在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发布于 2022-01-13 04:54:48
不能将变量名称用作对象引用的一部分。为此,您需要使用动态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;请注意以下事项:
through
QUOTENAME正确转义数据库名
nvarchar(max)存储动态SQL
sp_executesql传递参数@id_id所有的方式都应该存储为sysname
sp_作为过程前缀,它保留给系统过程H 217F 218https://stackoverflow.com/questions/70691340
复制相似问题