我的问题如下
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附近的语法不正确。'
答案 0 :(得分:3)
您正在运行两个不同的exec
语句。
一次性完成:
exec ('insert into' + @TargetDatabase + '.dbo.tblContact ' +
'select * from ' + @SourceDatabase+'.dbo.tblContact')
答案 1 :(得分:0)
只是略有不同的方法。我更喜欢sp_executesql
而不是EXEC
(some 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 *
- 这段代码非常脆弱,因为对这两个表的更改都会导致错误,数据错误或更糟。