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