Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak działa FOR XML PATH('') podczas łączenia wierszy

Co FOR XML PATH('xxx') tworzy ciąg XML dla zestawu wyników, który umieszcza każdy wiersz w <xxx></xxx> element i każdą wartość kolumny w wierszu, w elemencie o nazwie dla tej kolumny.

Jeśli PATH jest pusta (np. PATH('') ) pomija element wiersza w generowaniu XML. Jeśli kolumna nie ma nazwy, pomija element kolumny w generowaniu XML. Gdy obie PATH są puste, a kolumny nie mają nazw, w efekcie staje się konkatenacją ciągów wszystkich wierszy.

Uruchom następujące stwierdzenia, aby uzyskać lepszy wgląd w proces:

-- 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;

Teraz słyszę, jak pytasz:Jak mogę usunąć nazwę kolumny, kiedy po prostu wybieram kolumnę z tabeli. Istnieje kilka sposobów, w kolejności moich preferencji:

  • Właściwości XQuery:SELECT [text()]=column_name ...
  • Użyj podzapytania, aby wybrać wartość kolumny:SELECT (SELECT column_name) ...
  • Prześlij kolumnę do jej typu:SELECT CAST(column_value AS <TYPE of the column>) ...

Przykłady:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wartość kolumny tożsamości nagle skacze do 1001 na serwerze sql

  2. Zapytanie SQL, aby wybrać ciąg między dwoma znanymi ciągami

  3. Importuj plik CSV do SQL Server

  4. Czy zadanie SQL Server pominie zaplanowane uruchomienie, jeśli jest już uruchomione?

  5. Formatowanie SQL w SQL Server Management Studio