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

thêm thông tin mã hóa vào kết quả của FOR XML

Như @gbn đã chỉ ra trong một câu trả lời khác và trên câu hỏi khác , " dữ liệu XML được lưu trữ nội bộ dưới dạng ucs- 2 "và SQL Server không bao gồm nó khi tạo dữ liệu. Tuy nhiên, bạn có thể chuyển đổi XML thành một chuỗi và nối khai báo XML vào đầu theo cách thủ công. Tuy nhiên, chỉ sử dụng UTF-8 trong khai báo sẽ không chính xác. Chuỗi Unicode mà SQL tạo ra nằm trong UCS-2. Ví dụ:chuỗi này sẽ không thành công:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));

có lỗi:

Mặt khác, điều này sẽ hoạt động như mong đợi:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));

Đây là mã sẽ tạo ra chuỗi XML đầy đủ, đầy đủ khai báo mà bạn tìm kiếm cho dữ liệu mẫu của mình:

DECLARE @Agents TABLE
(
    AgentID int,
    AgentName nvarchar(50),
    AgentLocation nvarchar(100)
);
INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (1, N'Mike', N'Sanfrancisco');
INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (2, N'John', N'NY');

WITH BaseData AS
(
    SELECT
        (
            SELECT
                AgentID AS '@id',
                AgentName AS 'Name',
                AgentLocation AS 'Location'
            FROM    @Agents
            FOR     XML PATH('Agent'), ROOT('Agents'), TYPE
        ) AS AgentXML
), FullStringTable AS
(
    SELECT
        *,
        '<?xml version="1.0" encoding="UCS-2"?>' +
        CONVERT(nvarchar(max),AgentXML) AS FullString
    FROM        BaseData
)
SELECT
    AgentXML AS OriginalXML,
    FullString,
    CONVERT(xml,FullString) AS FullStringConvertedToXML
FROM        FullStringTable;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng mệnh đề HAVING trong câu lệnh CẬP NHẬT

  2. Làm thế nào để loại bỏ bất kỳ số cuối cùng nào khỏi một chuỗi?

  3. Hiệu suất SQL:WHERE so với WHERE (ROW_NUMBER)

  4. Có thể sử dụng `SqlDbType.Structured` để chuyển các Tham số Giá trị Bảng trong NHibernate không?

  5. Thoát các ký tự đặc biệt trong câu lệnh SQL LIKE bằng cách sử dụng các tham số sql