感谢您帮助我解决在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_
作为过程前缀,它是为系统过程保留的