Добавление имени базы данных перед запросом на передачу данных - PullRequest
0 голосов
/ 19 июня 2020

На SQL сервере я планировал вставить данные из 4 таблиц с именем базы данных «A» в другую базу данных «B».

Я написал следующий запрос:

DECLARE @SourceDB as NVARCHAR(255)='665DB33AS1'
DECLARE @DestDB as NVARCHAR(255)='755DB33Ab2'
DECLARE @SourceDID as NVARCHAR(255)='121sdfsdf1212sfw'

INSERT INTO @DestDB.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
SELECT [DID], [LocalID], [Extension], [Content]
FROM @SourceDB .[ABC104].[Document]
WHERE [DID] = =@SourceDID)

Но здесь я не могу правильно заменить имена исходной и целевой базы данных.

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Вы можете достичь этого, используя DYNAMIC SQL

DECLARE @DestDB as NVARCHAR(255)='755DB33Ab2'
DECLARE @SourceDID as NVARCHAR(255)='121sdfsdf1212sfw'
DECLARE @SQL VARCHAR(MAX)

SET @SQL=CONCAT('INSERT INTO', @DestDB,'.[ABC104].[Document]([DID], [LocalID], [Extension], [Content])
SELECT [DID], [LocalID], [Extension], [Content] FROM',@SourceDB,' .[ABC104].[Document] WHERE [DID] = ',@SourceDID)

SELECT @SQL
EXEC (@SQL)
0 голосов
/ 19 июня 2020

Этот тип кода кажется очень подозрительным. Кажется, что то, что хранится в разных базах данных, должно храниться в одной базе данных - возможно, в одной таблице.

Но иногда это необходимо.

Вам нужен динамический 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% безопасного источника.

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