Этот тип кода кажется очень подозрительным. Кажется, что то, что хранится в разных базах данных, должно храниться в одной базе данных - возможно, в одной таблице.
Но иногда это необходимо.
Вам нужен динамический c SQL. Я бы порекомендовал:
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = '
INSERT INTO @DestDB.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
SELECT [DID], [LocalID], [Extension], [Content]
FROM @SourceDB.[ABC104].[Document]
WHERE [DID] = @SourceDID
';
SET @SQL = REPLACE(@SQL, '@DestDB', @DestDb); -- might want quotename
SET @SQL = REPLACE(@SQL, '@SourceDB', @SourceDB); -- might want quotename
EXEC sp_executesql @SQL,
'N@SourceDID NVARCHAR(255)',
@SourceDID=@SourceDID;
Обратите внимание, что это заменяет идентификаторы, использующие REPLACE()
. Это выполняется в несколько этапов, поэтому легко увидеть, что заменяется.
Кроме того, это не заменяет @SourceDID
, потому что это просто значение для сравнения, которое параметризованный запрос может легко обработать.
Я не добавлял QUOTENAME()
, но при вставке названий вещей это лучшая практика, особенно если данные поступают из менее чем на 100% безопасного источника.