2012-02-11 76 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 * - 此代碼是非常脆弱的更改爲表將導致錯誤,錯誤的數據,或者更糟。