2011-06-02 30 views
3

我有一個腳本,它在SQL 2008中使用FOR XML返回一個XML。有什麼方法可以在輸出的開頭添加版本和編碼信息。最終,我打算將輸出保存在一個文件中。將編碼信息添加到FOR XML的結果

例如,現在我的輸出看起來像這樣

<Agents> 
    <Agent id="1"> 
    <Name>Mike</Name> 
    <Location>Sanfrancisco</Location> 
    </Agent> 
    <Agent id="2"> 
    <Name>John</Name> 
    <Location>NY</Location> 
    </Agent> 
</Agents> 

我想追加線<?xml version="1.0" encoding="UTF-8"?>在XML輸出

所以我想輸出像

的開始
<?xml version="1.0" encoding="UTF-8"?> 
<Agents> 
<Agent id="1"> 
    <Name>Mike</Name> 
    <Location>Sanfrancisco</Location> 
</Agent> 
<Agent id="2"> 
    <Name>John</Name> 
    <Location>NY</Location> 
</Agent> 

回答

0

如果您不會試圖操縱結果TSQL XML,然後做將創建一個最簡單的事情varchar與你想追加的字符串,然後使用CAST statemnt將XML添加到它以將XML轉換爲varchar。

declare @testXML as XML 
declare @testPrefix as varchar(255) 
set @testPrefix = '<?xml version="1.0" encoding="UTF-8"?>' 
set @testXML = '<Agents> <Agent id="1"> <Name>Mike</Name> <Location>Sanfrancisco</Location> </Agent> <Agent id="2"> <Name>John</Name> <Location>NY</Location> </Agent></Agents>' 

select @testPrefix 
Select @testXML 
select @testPrefix + CAST(@testXML as varchar(max)) 
3

由於@gbn在another answeranother question,指出生產數據時, 「the XML data is stored internally as ucs-2」,和SQL Server不包含它。但是,您可以將XML轉換爲字符串,並手動在起始處附加XML聲明。但是,在聲明中使用UTF-8將是不準確的。 SQL產生的Unicode字符串在UCS-2中。例如,這將失敗:

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

錯誤:

Msg 9402, Level 16, State 1, Line 1 XML parsing: line 1, character 38, unable to switch the encoding

此,在另一方面,將如預期:

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

這裏是代碼,這將產生滿載聲明的XML字符串,您需要查找示例數據:

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;