Sql server 在SQL Server中合并两个表并转换XML

Sql server 在SQL Server中合并两个表并转换XML,sql-server,xml,sql-server-2016,Sql Server,Xml,Sql Server 2016,我有两个包含Type1和Type2产品信息的表,还有一个包含费率信息的通用表 考虑下表结构 表1Type1Product: Id Name TAX Model Class ___________________________________________________ GUID 1 Type1_Product_1 5 SUX XI GUID 2 Type1_Product_2 5 S

我有两个包含Type1和Type2产品信息的表,还有一个包含费率信息的通用表

考虑下表结构

表1
Type1Product

Id        Name               TAX    Model    Class
___________________________________________________
GUID 1    Type1_Product_1    5      SUX      XI
GUID 2    Type1_Product_2    5      SUX      XII
GUID 3    Type1_Product_3    5      SUX      X
GUID 4    Type1_Product_4    5      SUX      XIII
Id        Name               TAX    Catalog
___________________________________________________
GUID 5    Type2_Product_1    5      IXM
GUID 6    Type2_Product_2    5      IXM
GUID 7    Type2_Product_3    5      IXM
GUID 8    Type2_Product_4    5      IXM
表2
Type2Product

Id        Name               TAX    Model    Class
___________________________________________________
GUID 1    Type1_Product_1    5      SUX      XI
GUID 2    Type1_Product_2    5      SUX      XII
GUID 3    Type1_Product_3    5      SUX      X
GUID 4    Type1_Product_4    5      SUX      XIII
Id        Name               TAX    Catalog
___________________________________________________
GUID 5    Type2_Product_1    5      IXM
GUID 6    Type2_Product_2    5      IXM
GUID 7    Type2_Product_3    5      IXM
GUID 8    Type2_Product_4    5      IXM
表3
费率

Id         ProductId          Rate
___________________________________________________
GUID 11    GUID 1             15
GUID 12    GUID 2             25
GUID 13    GUID 3             33
GUID 14    GUID 4             11
GUID 15    GUID 5             5
GUID 16    GUID 6             8
GUID 17    GUID 7             2
GUID 18    GUID 8             4
现在我有了下面的SQL
SELECT
querywithunion

SELECT 
    t1.Id, t1.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type1Product t1 ON t1.Id = rt.ProductId

UNION

SELECT 
    t2.Id, t2.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type2Product t2 ON t2.Id = rt.ProductId
FOR XML PATH ('Product'), ELEMENTS, root ('Root')
注意:
GUID
是唯一标识符“guid1”表示唯一标识符,为便于理解,我使用了“guid1”等关键字

我在执行时出错

关键字“FOR”附近的语法不正确

请帮助我。

使用下面的代码

with tamp as (

        SELECT 
            t1.Id, t1.Name, rt.Rate 
        FROM 
            Rate rt 
        INNER JOIN 
            Type1Product t1 ON t1.Id = rt.ProductId

        UNION

        SELECT 
            t2.Id, t2.Name, rt.Rate 
        FROM 
            Rate rt 
        INNER JOIN 
            Type2Product t2 ON t2.Id = rt.ProductId
    )

    select * from temp  FOR XML PATH ('Product'), ELEMENTS, root ('Root')

您必须将Union语句包装在一个SELECT语句中,如下所示

SELECT(
SELECT * 
FROM(
SELECT 
    t1.Id, t1.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type1Product t1 ON t1.Id = rt.ProductId

UNION

SELECT 
    t2.Id, t2.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type2Product t2 ON t2.Id = rt.ProductId

) D
FOR XML PATH ('Product'), ELEMENTS, root ('Root')
) AS XMLout

对于xml*仅使用一个结果集,您可以使用CTE或子查询。。