Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách FOR XML PATH ('') hoạt động khi nối các hàng

Cái gì FOR XML PATH('xxx') hiện là tạo một chuỗi XML cho tập kết quả đặt mỗi hàng trong một <xxx></xxx> phần tử và mỗi giá trị cột bên trong hàng, trong phần tử có tên cho cột đó.

Nếu PATH trống (tức là PATH('') ) nó bỏ qua phần tử hàng trong quá trình tạo XML. Nếu cột không có tên, nó sẽ bỏ qua phần tử cột trong quá trình tạo XML. Khi cả hai PATH đều trống và các cột không có tên, nó thực sự trở thành một chuỗi nối tất cả các hàng.

Chạy các câu lệnh sau để có cái nhìn sâu sắc hơn trong quá trình này:

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

Bây giờ tôi nghe bạn hỏi:Làm cách nào để xóa tên cột khi tôi chỉ cần chọn một cột từ một bảng. Có một số cách, theo thứ tự ưu tiên của tôi:

  • Thuộc tính XQuery:SELECT [text()]=column_name ...
  • Sử dụng truy vấn con để chọn giá trị cột:SELECT (SELECT column_name) ...
  • CAST cột thành loại của nó:SELECT CAST(column_value AS <TYPE of the column>) ...

Ví dụ:

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. ADO.NET gọi Thủ tục lưu trữ T-SQL gây ra SqlTimeoutException

  2. Truy vấn này làm gì để tạo danh sách SQL Server được phân tách bằng dấu phẩy?

  3. Làm cách nào để khắc phục xung đột đối chiếu trong truy vấn SQL Server?

  4. Làm cách nào để sao chép cơ sở dữ liệu SQL Azure vào máy chủ phát triển cục bộ của tôi?

  5. Truy vấn SQL để tìm mức lương cao nhất thứ N từ bảng lương