2012-02-11 77 views
0

我的问题是以下想从一个表中插入值到另一个表而从两个不同的数据库

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' [email protected]+'.dbo.tblContact') 
exec('select * from ' [email protected]+'.dbo.tblContact') 

在这段代码选择查询工作正常

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

回答

3

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

做在一个单一的一个:

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

现在它显示'错误的语法靠近选择* – Varinder 2012-02-11 14:13:03

+0

Thanku,Thanku,Thanku – Varinder 2012-02-11 14:25:17

+0

它现在适合你吗? – Blorgbeard 2012-02-11 14:38:24

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 

我会告诫不要使用INSERT没有列清单和SELECT * - 此代码是非常脆弱的更改为表将导致错误,错误的数据,或者更糟。