首页 > 解决方案 > 执行从本地表值参数或临时表源到链接服务器的合并

问题描述

我的目标是将数据从 webapp 加载到链接服务器上的数据库中。用户将创建数千行 8 列的数据。

我试图在Microsoft的Table Valued Parameters文章中实现 P assing a Table Valued Parameter to a Parameterized SQL Statement的一个版本。

我遇到的一个大问题是弄清楚如何将表值参数或临时表传递到Execute()中,我将在其中放置 MERGE。

将数据从 Web 应用程序移动到本地数据库然后是链接服务器的最佳方式是什么?

这是我可以使用临时表获得的尽可能接近的结果:

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语句。

标签: tsqltemp-tableslinked-servertable-valued-parameters

解决方案


推荐阅读