想要将值从一个表插入另一个表,但是要从两个不同的数据库中插入

时间:2012-02-11 13:56:58

标签: sql-server sql-server-2005

我的问题如下

insert into TargetDatabase.dbo.tblContact

Select * from SourceDatabase.dbo.tblContact

如上所示。我想将同一个表的数据插入到同一个表中,但数据库是不同的

我尝试了以下

Create Procedure Demo
@SourceDatabase as  nvarchar(100),
@TargetDatabase as  nvarchar(100)
as 
exec ( 'insert into' +@TargetDatabase+'.dbo.tblContact')
exec('select * from ' +@SourceDatabase+'.dbo.tblContact')

在此代码中,选择查询工作正常

但插入它时会抛出错误'tbl Contact附近的语法不正确。'

2 个答案:

答案 0 :(得分:3)

您正在运行两个不同的exec语句。

一次性完成:

exec ('insert into' + @TargetDatabase + '.dbo.tblContact ' + 
      'select * from ' + @SourceDatabase+'.dbo.tblContact') 

答案 1 :(得分:0)

只是略有不同的方法。我更喜欢sp_executesql而不是EXECsome background here),我发现REPLACE比经典连接更清晰,特别是当变量多次嵌入脚本中时。我通常还会添加一个@debug标志,以便我可以选择打印语句进行健全性检查而不是执行它。

CREATE PROCEDURE dbo.Demo
    @SourceDatabase NVARCHAR(100),
    @TargetDatabase NVARCHAR(100),
    @debug BIT = 0
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SET @sql = N'INSERT [$t$].dbo.tblContact SELECT * FROM [$s$].dbo.tblContact;';

    SET @sql = REPLACE(REPLACE(@sql, '$t$', @TargetDatabase), '$s$', @SourceDatabase);

    IF @debug = 1
        PRINT @sql;

    IF @debug = 0
        EXEC sp_executesql @sql;
END
GO

我会警告不要使用没有列列表的INSERTSELECT * - 这段代码非常脆弱,因为对这两个表的更改都会导致错误,数据错误或更糟。