5

これは別の「for xml」の質問ですが、明示モードなしでこれを実行できるかどうかはわかりません。それができないなら、我慢するしかない。

以下は、現在私の選択ステートメントです:

    SELECT
        [stream_id] as '@stream_id',
        [path_locator] as '@path_locator',
        [parent_path_locator] as '@parent_path_locatr',
        [file_type] as '@file_type',
        [cached_file_size] as '@cached_file_size',
        [creation_time] as '@creation_time',
        [last_write_time] as '@last_write_time',
        [last_access_time] as '@last_access_time',
        [is_directory] as '@is_directory',
        [is_offline] as '@is_offline',
        [is_hidden] as '@is_hidden',
        [is_readonly] as '@is_readonly',
        [is_archive] as '@is_archive',
        [is_system] as '@is_system',
        [is_temporary] as '@is_temporary',
        [name] as '/name',
        dbo.udf_GetChildren(path_locator)
    FROM @Merged
    WHERE path_locator.GetLevel() = 1
    FOR XML PATH'file'), ROOT('files'), TYPE

これにより、次の xml が出力されます。

 <files>
   <file stream_id="" etc...>
      <name>NAME</name>
   </file>
 </files>

これは悪くありませんが、 name要素の値をfile要素の値として取得したいのです。これは非常に単純なタスクであり、明示モードなしで実行できると思いますが、そのようなことについてかなり頻繁に間違っています。

「/」マーカーを使用してみましたが、これは必要な効果がないようです (たとえば、SQL Server 2005 の XML ノード (XML 列内) を同じ行の別の列値で更新)。

編集: 必要な xml は次のようになります。

 <files>
   <file stream_id="" etc...>NAME</file>
 </files>

助けてくれてありがとう。

4

3 に答える 3

3

使用するname as '*'

名前がワイルドカード文字として指定された列

于 2013-02-01T20:52:18.947 に答える
2

フィールドから列名を削除する必要があると思います-空白を最後に連結することでこれを行うことができました。上記の例で作業できるようになるはずの要約バージョンを次に示します。

SELECT name + ''
FROM TestXML
FOR XML PATH('file')

そして、これがSQL Fiddleです。

そしてそれについての良い記事:

http://msdn.microsoft.com/en-us/library/bb510469.aspx

上記のクエリは次のとおりです。

SELECT
    [stream_id] as '@stream_id',
    [path_locator] as '@path_locator',
    [parent_path_locator] as '@parent_path_locatr',
    [file_type] as '@file_type',
    [cached_file_size] as '@cached_file_size',
    [creation_time] as '@creation_time',
    [last_write_time] as '@last_write_time',
    [last_access_time] as '@last_access_time',
    [is_directory] as '@is_directory',
    [is_offline] as '@is_offline',
    [is_hidden] as '@is_hidden',
    [is_readonly] as '@is_readonly',
    [is_archive] as '@is_archive',
    [is_system] as '@is_system',
    [is_temporary] as '@is_temporary',
    [name] + '',
    dbo.udf_GetChildren(path_locator)
FROM @Merged
WHERE path_locator.GetLevel() = 1
FOR XML PATH'file'), ROOT('files'), TYPE

幸運を。

于 2013-02-01T20:37:57.810 に答える
1

fileノードを各列に移動しました。

SELECT [stream_id] AS 'file/@stream_id'
   , [is_system] AS 'file/@is_system'
   , [is_temporary] AS 'file/@is_temporary'
   ...
   , [name] AS 'file'
FROM Merged
FOR XML PATH('files'), TYPE;
于 2013-02-01T20:40:56.397 に答える