2016-09-27 66 views
1

我试图在SQL Server 2014中生成以下所需格式的XML。但是我无法做出这个向Param添加属性名称的小改变元素。我只是想使用值将“name”属性添加到Param元素。sql server - 对于XML Raw - 向元素添加自定义属性

当前SQL语句: -

Declare @requestMessage xml, 
    @P1 nvarchar(20)= 'Rocky', @P2 nvarchar(20) = 'Boxer', @P3 nvarchar(20) = 'SpaceX', 
@P4 nvarchar(20) 

select @requestMessage = (select 'dbo.usp_InsertUserPlay' as [SProc], 
            (select @P1 as [Param], 
              @P2 as [Param],  
              @P3 as [Param],   
              @P4 as [Param],  
              0 as [Param] 
         FOR XML RAW('ParamList'), TYPE, ELEMENTS XSINIL) 
        FOR XML PATH('AsyncRequest'), TYPE, ELEMENTS XSINIL) 

select @requestMessage AS XML_Output 

XML输出: -

<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SProc>dbo.usp_InsertUserPlay</SProc> 
    <ParamList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Param>Rocky</Param> 
    <Param>Boxer</Param> 
    <Param>SpaceX</Param> 
    <Param xsi:nil="true" /> 
    <Param>0</Param> 
    </ParamList> 
</AsyncRequest> 

我期望中的XML输出: -

<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SProc>dbo.usp_InsertUserPlay</SProc> 
    <ParamList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Param name="P1">Rocky</Param> 
     <Param name="P2">Boxer</Param> 
     <Param name="P3">SpaceX</Param> 
     <Param name="P4" xsi:nil="true" /> 
     <Param name="P5">0</Param> 
    </ParamList> 
</AsyncRequest> 

回答

2

这应该产生预期的XML:

Declare 
    @P1 nvarchar(20)= 'Rocky', 
    @P2 nvarchar(20) = 'Boxer', 
    @P3 nvarchar(20) = 'SpaceX', 
    @P4 nvarchar(20) 

select 'dbo.usp_InsertUserPlay' as [SProc], 
(
    select * FROM (VALUES 
     ('P1', @P1), 
     ('P2', @P2),  
     ('P3', @P3), 
     ('P4', @P4), 
     ('P5', '0')) T([Param/@name], [Param]) 
    FOR XML PATH(''), ROOT('ParamList'), TYPE, ELEMENTS XSINIL 
) FOR XML PATH('AsyncRequest'), TYPE, ELEMENTS XSINIL 

结果:

<AsyncRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SProc>dbo.usp_InsertUserPlay</SProc> 
    <ParamList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Param name="P1">Rocky</Param> 
    <Param name="P2">Boxer</Param> 
    <Param name="P3">SpaceX</Param> 
    <Param name="P4" xsi:nil="true" /> 
    <Param name="P5">0</Param> 
    </ParamList> 
</AsyncRequest> 
+0

感谢您的帮助:-) – Karan

+0

另一件事,我在这里注意到。我们必须将基于非字符串的参数CAST转换为nvarchar(max)数据类型以防止运行时XML生成错误。例如,如果@ P4是int,那么语句应该是('P4',CAST(@ P4 as nvarchar(max))) – Karan