我在SQL Server 2012中有两个表。
tblSource
保留在SourceDB数据库中,tblTarget
保留在TargetDB数据库中。上述两个表都保留在同一台服务器上。
所以我想用这个查询将数据从源表传输到目标表:
INSERT INTO TargetDB.dbo.tblTarget(ProductID, ProductName, CategoryName)
SELECT
p.ProductID, p.ProductName, c.CategoryName
FROM
dbo.tblProduct p
LEFT JOIN
dbo.tblCategory c ON p.ProductID = c.ProductID
这里,
TargetDB.dbo.tblTarget
但它不起作用。
无效的对象名称'dbo.tblTarget'
我该怎么做?将数据传输到目标数据库,而不使用来自源db的前缀db name。
这是必需的,因为我必须在3个服务器中执行此操作,其中数据库名称不相同。 这可能吗?
答案 0 :(得分:0)
我怀疑是否可以不提及database
名称;
当您说dbo.tblTarget
时,将在数据库中搜索session pointed to
对象。
如果你想查看其他数据库,那么你也必须提到数据库名称。 TargetDB.dbo.tblTarget
。
您可以使用dynamic sql
和procedure
;
create procedure insert_data(
@TargetDB as nvarchar(250)
)
as
begin
DECLARE @SQLString nvarchar(500);
SET @SQLString = N'INSERT INTO ' + @TargetDB +'.dbo.tblTarget(ProductID, ProductName, CategoryName)
SELECT
p.ProductID, p.ProductName, c.CategoryName
FROM dbo.tblProduct p
LEFT JOIN dbo.tblCategory c ON p.ProductID = c.ProductID'
EXECUTE sp_executesql @SQLString
end;
go
在procedure
中创建sourceDB
。
然后使用targetDB作为in参数执行该过程。
exec insert_data('targetDB1')
exec insert_data('targetDB2')
exec insert_data('targetDB3')....