0

SQL クエリを使用して XML を返そうとしてFOR XMLいますが、必要な正確な形式に変換できないようです。

これまでに作成したステートメントは次のとおりです。

SELECT TOP 1 
  ID AS '@id'
  ,1 AS '@version'
  ,'en' AS '@lang'
  ,'Joe Smith' AS 'field/Name'
  ,'email@add.com' AS 'field/Email' 
FROM Table
FOR XML PATH ('add')

返される XML 形式:

<add id="123" version="1" lang="en">
  <field>
    <Name>Joe Smith</Name>
    <Email>email@add.com</Email>
  </field>
</add>

返す必要がある方法:

<add id="123" version="1" lang="en">
  <field name="Name">Joe Smith</field>
  <field name="Email">email@add.com</field>
</add>

これを行うにはどうすればよいですか。これまでのところ、オンラインで見つけたドキュメントで得たものはこれまでです。助けてください。

4

1 に答える 1

3

1)

SELECT TOP 1 
  ID AS '@id'
  ,1 AS '@version'
  ,'en' AS '@lang'
  ,(
    SELECT  x.Attribute AS  '@name',
            x.Value     AS  'text()'
    FROM    (VALUES (N'Name', N'Joe Smith'), (N'Email', N'email@add.com')) x(Attribute,Value)
    FOR XML PATH('field'), TYPE
  )
FROM (SELECT 1 ID) AS Table1
FOR XML PATH ('add')

2) 2 番目のソリューションでは、テンプレートと変数を使用します。私が見たので、この解決策を提案しますTOP 1(最大1行)。まず、その行の値を変数 ( SELECT @Variable = Column, ... FROM Table) に転送する必要があります。柔軟性は向上しますが、パフォーマンス影響を受ける可能性があります (注: テストは行っていません)。

DECLARE 
    @ID INT = 1,
    @Version INT = 1,
    @Lang NVARCHAR(10) = N'en',
    @Name NVARCHAR(50) = N'Joe Smith',
    @Email NVARCHAR(100) = N'email@add.com'

DECLARE @x XML = N'';
SELECT @x.query(N'
<add id="{sql:variable("@ID")}" version="{sql:variable("@Version")}" lang="{sql:variable("@Lang")}">
  <field name="Name">{sql:variable("@Name")}</field>
  <field name="Email">{sql:variable("@Email")}</field>
</add>
');
于 2013-12-30T17:26:12.970 に答える