sql >> Databáze >  >> RDS >> Sqlserver

PRO cestu XML na serveru SQL a [text()]

Ostatní aktuální odpovědi příliš nevysvětlují, odkud to pochází, nebo jen nabízejí odkazy na špatně formátované stránky a ve skutečnosti na otázku neodpovídají.

V mnoha odpovědích na webu pro seskupování řetězců jsou odpovědi typu copy a past bez velkého vysvětlení toho, co se děje. Chtěl jsem na tuto otázku odpovědět lépe, protože mě zajímalo totéž, a také poskytnout náhled na to, co se vlastně celkově děje.

tldr;

Stručně řečeno, toto je syntaxe, která pomáhá transformovat výstup XML při použití FOR XML PATH který používá názvy sloupců (nebo aliasy) ke strukturování výstupu. Pokud sloupec pojmenujete text() data budou reprezentována jako text v kořenové značce.

<row>
    My record's data
<row>

V příkladech, které vidíte online, jak seskupit řetězce a spojit pomocí , nemusí to být zřejmé (kromě skutečnosti, že váš dotaz obsahuje málo for xml část), že ve skutečnosti vytváříte soubor XML se specifickou strukturou (nebo spíše chybějící strukturou) pomocí FOR XML PATH ('') . ('') odstraňuje kořenové xml tagy a jen vyplivuje data.

Dohoda s AS [text()]

Jako obvykle AS jedná, aby pojmenoval nebo přejmenoval alias sloupce. V tomto příkladu vytváříte alias tohoto sloupce jako [text()] . [] s jsou prostě standardní oddělovače sloupců SQL Serveru, často nepotřebné, kromě dneška, protože název našeho sloupce má () s. Zbývá nám tedy text() pro název našeho sloupce.

Ovládání struktury XML pomocí názvů sloupců

Když používáte FOR XML PATH vytváříte soubor XML a můžete řídit strukturu pomocí názvů sloupců. Podrobný seznam možností naleznete zde:https://msdn.microsoft .com/en-us/library/ms189885.aspx

Příkladem je začátek názvu sloupce znakem @, například:

SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH

Tím by se data tohoto sloupce přesunula do atributu aktuálního řádku xml, nikoli do položky v něm. Skončíte s

<row color="red">
  <name>tim</name>
</row>
<row color="blue">
  <name>that guy</name>
</row>

Pak se vraťte k [text()] . Toto ve skutečnosti určuje test uzlu XPath . V kontextu MS Sql Server se o tomto označení můžete dozvědět zde . V zásadě to pomáhá určit typ prvku, do kterého tato data přidáváme, jako je normální uzel (výchozí), komentář xml nebo v tomto příkladu nějaký text ve značce.

Příklad využívající několik pohybů ke strukturování výstupu

SELECT 
  color as [@color]
  ,'Some info about ' + name AS [text()]
  ,name + ' likes ' + color AS [comment()]
  ,name
  ,name + ' has some ' + color + ' things' AS [info/text()]
FROM #favorite_colors
FOR XML PATH

Všimněte si, že v názvech sloupců používáme několik označení:

  • @color :atribut značky
  • text() :nějaký text pro tuto kořenovou značku
  • comment() :xml komentář
  • info/text() :nějaký text ve specifické značce xml, <info>

Výstup vypadá takto:

<row color="red">
    Some info about tim
    <!--tim likes red-->
    <name>tim</name>
    <info>tim has some red things</info>
</row>
<row color="blue">
    Some info about that guy
    <!--that guy likes blue-->
    <name>that guy</name>
    <info>that guy has some blue things</info>
</row>

Když to shrnu, jak mohou tyto nástroje seskupovat a spojovat řetězce?

Takže s řešeními, která vidíme pro seskupování řetězců pomocí FOR XML PATH , existují dvě klíčové složky.

  • AS [text()] :Zapíše data jako text, místo aby je obalila tagem
  • FOR XML PATH ('') :Přejmenuje kořenovou značku na '' , nebo spíše ji zcela odstraní

To nám dává výstup „XML“ (vzduchové uvozovky), který je v podstatě jen řetězec.

SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('')  -- no root tag

vrací

tim, that guy, 

Odtud je to jen otázka spojení těchto dat zpět do větší datové sady, ze které pochází.



  1. Snaží se získat majetek bez objektu

  2. Spouštění v režimu spánku je velmi pomalé

  3. Jak OBJEDNAT PODLE dvou různých sloupců

  4. SQL Server 2008 – zmenšení protokolu transakcí – nějaký způsob automatizace?