Хотите вставить значения из одной таблицы в другую, но из двух разных баз данных - PullRequest
0 голосов
/ 11 февраля 2012

Моя проблема заключается в следующем

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')

В этом коде Select Query работает отлично

но при вставке выдает ошибку 'Неверный синтаксис рядом с контактом tbl.'

Ответы [ 2 ]

3 голосов
/ 11 февраля 2012

Вы используете два разных оператора exec.

Сделайте это за один раз:

exec ('insert into' + @TargetDatabase + '.dbo.tblContact ' + 
      'select * from ' + @SourceDatabase+'.dbo.tblContact') 
0 голосов
/ 11 февраля 2012

Просто немного другой подход. Я предпочитаю sp_executesql вместо EXEC ( некоторый фон здесь ) и нахожу 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 * - этот код очень хрупкий, так как изменение любой таблицы приведет к ошибкам, неправильным данным или к худшему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...