2014-01-14 184 views
0

我必须为分布式数据库创建存储过程白色参数。我正在使用SQL Server Management Studio Express。程序必须在分布式数据库中搜索使用以下运营商:链接服务器的过程SQL Server

UNION 
INTERSECT 
EXCEPT 
RPC 

我写了一个脚本,但它不起作用。

CREATE PROC UnioProccedure 
    @Par_IDProdukt int, 
    @Par_IDProducent int, 
    @Par_Model char(20) 
AS 
    INSERT dbo.PRODUKT (IDProdukt, IDProducent, Model) 
    VALUES (@Par_IDProdukt, @Par_IDProducent, @Par_Model) 

    SELECT (
     SELECT * FROM PRODUKT 
     UNION 
     SELECT * FROM [SERVERX].Shop.dbo.myTable 
     WHERE 
      IDProdukt = @Par_IDProdukt and 
      IDProducent = @Par_IDProducent AND 
      Model = @Par_Model) a 
GO 

我的第二个问题是:

创建存储过程,用于基于所述协议2PC两个服务器分布式事务。

我只需要一个模式。

请帮助:)

+0

顺便提一下,两阶段提交仅适用于UPDATES,INSERTS或DELETES。这是一个SELECT语句。 –

+1

此外,需要在UNION中显示相同数量的列,以删除与UNION ALL相比较的重复项。将表复制到一个服务器的另一个数据库中,获取正确的SYNTAX,然后放到分布式系统上。 –

回答

0

无论链接服务器的问题,你的选择是不正确的INSERT结构。我没有看到创建SUBQUERY的理由。为了清晰起见,当使用UNION(UNION ALL更好的性能)时,应该为列指定名称。

试试这个:

SELECT Col1 AS [ProdId], 
     Col2 AS [IDProducent], 
     Col3 AS [Model] 
FROM PRODUKT AS P 
UNION ALL 
SELECT 
     Col1 AS [ProdId], 
     Col2 AS [IDProducent], 
     Col3 AS [Model] 
FROM [SERVERX].Shop.dbo.myTable AS MT 
WHERE 
    IDProdukt = @Par_IDProdukt and 
    IDProducent = @Par_IDProducent AND 
    Model = @Par_Model 

很显然,我不知道怎么称呼你列,但你需要使用UNION ALL时,否则必须提到他们的位置给予一致的名称(1,2,3 ...),这是丑陋的。

请确保您更改了WHERE子句并在列前添加了正确的表别名。