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('');