sql >> Databasteknik >  >> RDS >> Sqlserver

How FOR XML PATH('') fungerar vid sammanlänkning av rader

Vad FOR XML PATH('xxx') gör är att skapa en XML-sträng för resultatuppsättningen som placerar varje rad i en <xxx></xxx> element och varje kolumnvärde inuti raden, i ett element med namnet för den kolumnen.

Om PATH är tom (dvs. PATH('') ) det utelämnar radelementet i XML-genereringen. Om kolumnen inte har något namn utelämnas kolumnelementet i XML-genereringen. När både PATH är tomma och kolumner inte har några namn blir det i praktiken en strängsammansättning av alla rader.

Kör följande påståenden för att få en bättre insikt 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ör jag dig fråga:Hur kan jag ta bort kolumnnamnet när jag helt enkelt väljer en kolumn från en tabell. Det finns flera sätt, i den ordning jag föredrar:

  • XQuery-egenskaper:SELECT [text()]=column_name ...
  • Använd en underfråga för att välja kolumnvärdet:SELECT (SELECT column_name) ...
  • CAST kolumnen till dess typ:SELECT CAST(column_value AS <TYPE of the column>) ...

Exempel:

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. oracle - konvertera många datumformat till ett enda formaterat datum

  2. Hur man övervakar din ProxySQL med Prometheus och ClusterControl

  3. Ordningsföljd för SQL-frågan

  4. Hur undkommer man apostrof (') i MySql?