sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan FOR XML PATH('') virker ved sammenkædning af rækker

Hvad FOR XML PATH('xxx') gør er at oprette en XML-streng for resultatsættet, der placerer hver række i en <xxx></xxx> element og hver kolonneværdi inde i rækken, i et element med navnet på den pågældende kolonne.

Hvis PATH er tom (dvs. PATH('') ) den udelader rækkeelementet i XML-genereringen. Hvis kolonnen ikke har noget navn, udelades kolonneelementet i XML-genereringen. Når både PATH er tom, og kolonner ikke har nogen navne, bliver det effektivt en strengsammenkædning af alle rækker.

Kør følgende udsagn for at få et bedre indblik i processen:

-- Each row is in a <beta></beta> element
-- Each column in that row in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('beta');

-- Since the PATH is empty, the rows are not put inside an element
-- Each column in that row is in a <alfa></alfa> element (the column name)
SELECT
    alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- Since the PATH is empty, the rows are not put inside an element
-- Since the column has no name it is not put inside an element     
SELECT
    ','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

-- This uses the STUFF function to remove the leading comma to get a proper comma-seperated list    
SELECT STUFF((
    SELECT
        ','+TABLE_SCHEMA + '.' + TABLE_NAME
    FROM
        INFORMATION_SCHEMA.TABLES
    FOR
        XML PATH('')
    ),1,1,''
) AS comma_seperated_list;

Nu hører jeg dig spørge:Hvordan kan jeg fjerne kolonnenavnet, når jeg blot vælger en kolonne fra en tabel. Der er flere måder, i den rækkefølge, jeg foretrækker:

  • XQuery-egenskaber:SELECT [text()]=column_name ...
  • Brug en underforespørgsel til at vælge kolonneværdien:SELECT (SELECT column_name) ...
  • CAST kolonnen til dens type:SELECT CAST(column_value AS <TYPE of the column>) ...

Eksempler:

SELECT
    [text()]=TABLE_NAME
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    (SELECT TABLE_NAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');

SELECT
    CAST(TABLE_NAME AS SYSNAME)
FROM
    INFORMATION_SCHEMA.TABLES
FOR
    XML PATH('');



  1. Eksplicitte JOINs vs implicitte joinforbindelser?

  2. Hvorfor justering af SQL-ydelse er den vigtigste evne til at håndtere databaser

  3. XML Server XML-ydeevneoptimering

  4. Dybdegående udforskning af Row Level Security