Моя цель - загрузить данные из веб-приложения в базу данных на связанном сервере. Пользователи будут создавать несколько тысяч строк данных с 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 .