Выполнение слияния из источника параметра локальной таблицы или источника временной таблицы на связанный сервер - PullRequest
0 голосов
/ 11 апреля 2020

Моя цель - загрузить данные из веб-приложения в базу данных на связанном сервере. Пользователи будут создавать несколько тысяч строк данных с 8 столбцами.

Я пытался реализовать версию P , в которой параметр с табличными значениями передавался параметризованному оператору SQL в Таблица значений параметров статья от Microsoft.

Большая проблема, с которой я столкнулся, - выяснить, как передать табличный параметр или временную таблицу в Execute () , куда я бы поместил MERGE.

Как лучше всего перенести данные из веб-приложения в локальную базу данных, а затем на связанный сервер?

Вот как можно лучше приблизиться к временным таблицам:

CREATE TABLE #TempTable
(
    car int not null,
    mileage int not null,
    interface DECIMAL(18,0) not null,
    primary key(car, interface)
);
SELECT 
        123 AS car,
        321 as mileage,
        444 AS interface
INTO #TempTable

EXEC('
CREATE TABLE #TempTable
(
    car int not null,
    mileage int not null,
    interface DECIMAL(18,0) not null,
    primary key(car, interface)
)

MERGE dbo.total AS target
USING #TempTable AS temp
ON temp.car = target.car AND temp.interface = target.interface AND temp.mileage = target.mileage 
WHEN MATCHED THEN
UPDATE SET target.mileage =  1337 
WHEN NOT MATCHED
THEN INSERT (car, interface, mileage) 
VALUES (temp.car, temp.interface, temp.mileage ); 
',#TempTable) at LinkedServer;

DROP TABLE #TempTable

Однако это запрос ничего не делает Ничего не передается.

Вот самое близкое, что я получил с параметром временной таблицы:

-- FYI only
CREATE TYPE TempType AS TABLE
(
    car int not null,
    mileage int not null,
    interface DECIMAL(18,0) not null,
    primary key(car, interface)
);

DECLARE @TempTable AS TempType;

INSERT INTO @TempTable (car, mileage, interface)
SELECT 1,1000,123;

SELECT('

DECLARE @TotalTemp AS TempType;

MERGE dbo.TargetTable AS targ 
USING @TotalTemp AS temp
ON temp.car = targ.car AND temp.interface = targ.interface 
WHEN MATCHED THEN
UPDATE SET targ.mileage =  1337 
WHEN NOT MATCHED
THEN INSERT (car, interface, mileage) 
VALUES (temp.car, temp.interface, temp.mileage); 
',@TempTable) at LinkedServer

Этот запрос дает синтаксическую ошибку.

Я также понимаю, что доступ к временной таблице со связанного сервера на локальный сервер был бы решением. Однако я разместил этот вопрос с единственной целью выяснить, возможна ли передача TVP или временной таблицы в оператор EXECUTE .

...