1

SQLクエリを使用して、SQLサーバーで使用しているXMLとして結果を返しています。私は以下のSQLクエリを使用しています-

SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT '' AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')

結果XML:

  <Rows>
    <Test>
      <Column1></Column1>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>

出力は次のようになります:

  <Rows>
    <Test>
      <Column1/>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>

どんな助けでもいただければ幸いです。前もって感謝します。

4

3 に答える 3

4

実際に XML をインナー化すると、タグは自己終了として返されます。以下の SQL コードを参照してください。

DECLARE @TempData Table
(
Column1 NVARCHAR(250)
)
INSERT INTO @TempData values('Column1')
INSERT INTO @TempData values('Column2')
INSERT INTO @TempData values('')
SELECT
(
SELECT * FROM @TempData FOR XML PATH('Test'), Type
)
For XML PATH (''),
ROOT('Rows')

出力:

<Rows>
  <Test>
    <Column1>Column1</Column1>
  </Test>
  <Test>
    <Column1>Column2</Column1>
  </Test>
  <Test>
    <Column1 />
  </Test>
</Rows>
于 2012-12-21T09:02:50.803 に答える
1

空の文字列を選択している場合、結果は正しいと思います。nullを選択してみてください。

SELECT '1' AS [Column1]
UNION
SELECT '2' AS [Column2]
UNION
SELECT NULL AS [Column3]
FOR XML PATH('Test'), ROOT('Rows')

結果:

<Rows>
  <Test />
  <Test>
    <Column1>1</Column1>
  </Test>
  <Test>
    <Column1>2</Column1>
  </Test>
</Rows>

それはあなたが望むようにさらに少ないです。


タグも削除したくないので、ここでこれを試してください:

declare @output nvarchar(max)

declare @XML xml = '
  <Rows>
    <Test>
      <Column1></Column1>
    </Test>
    <Test>
      <Column1>1</Column1>
    </Test>
    <Test>
      <Column1>2</Column1>
    </Test>
  </Rows>'

set @output = replace(cast(@XML as nvarchar(max)), '<Column1></Column1>', '<Column1/>')

select @output

xmlの結果をハードエンコードして申し訳ありませんが、出力を@XMLに動的に設定する方法を今は理解できません。

于 2012-12-21T05:54:30.490 に答える
1

まず、コメントで @marc-s が述べたように、両方の表現は XML 仕様に従って意味的に同等です。

空の要素の表現は、開始タグの直後に終了タグが続くか、空の要素タグのいずれかです。

http://www.w3.org/TR/REC-xml/#NT-content

以下も参照してください。

https://stackoverflow.com/a/2279530/2266979

コメントで、自己終了タグ表現に含まれる文字数が少ないことを明確にしました。

サーバーでは「バイナリ形式で内部的に保存される」ため、SQL Server の外部で XML を使用する場合にのみ問題になります ( https://technet.microsoft.com/en-US/library/ms345115(v=SQL.90 .aspx )。

これらの文字が重要になる SQL Server の外部で XML を使用している場合は、おそらくそれをテキストに変換しています。ただし、それを行うと、SQL Server (とにかく 2008) は自動的に自己終了タグを使用します。

例えば:

SELECT CONVERT(varchar(max),CONVERT(xml,'<tag></tag>'));

戻ります:

<tag/>

したがって、最終結果をテキストに変換するだけです。

これは、XML を入力したことを前提としています。FOR XML PATHキーワードを指定せずに XML を作成するとTYPE、本質的に XML のようなテキストを生成するだけです。

したがって、この:

SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH('')));

戻ります:

<tag></tag>

TYPE代わりにキーワードを使用する場合:

SELECT CONVERT(varchar(max),(SELECT '' AS 'tag' FOR XML PATH(''), TYPE));

あなたは得るでしょう:

<tag/>
于 2015-07-28T18:41:50.993 に答える