SqlServer將查詢結(jié)果轉(zhuǎn)換為XML和JSON
很久之前用到的,現(xiàn)在整理在這,里面一些代碼來源于網(wǎng)上,不過有些bug已被我修改了。
1.查詢結(jié)果轉(zhuǎn)XML
DECLARE @ParameterSQL NVARCHAR(MAX)='SELECT * FROM table'; DECLARE @SQL NVARCHAR(MAX) DECLARE @XMLString VARCHAR(MAX) DECLARE @XML XML DECLARE @Paramlist NVARCHAR(1000) SET @Paramlist = N'@XML XML OUTPUT' SET @SQL = 'WITH PrepareTable (XMLString)' SET @SQL = @SQL + 'AS( ' SET @SQL = @SQL + @ParameterSQL+ ' FOR XML RAW,TYPE,ELEMENTS' SET @SQL = @SQL + ')' SET @SQL = @SQL + 'SELECT @XML=[XMLString]FROM[PrepareTable]' EXEC sp_executesql @SQL, @Paramlist, @XML=@XML OUTPUT SET @XMLString=CAST(@XML AS VARCHAR(MAX)) SELECT @XML; SELECT @XMLString;
其中@ParameterSQL為要查詢的語句,@XMLXML格式數(shù)據(jù),@XMLStringXML轉(zhuǎn)成字符串
2.查詢結(jié)果轉(zhuǎn)JSON
查詢結(jié)果轉(zhuǎn)換成json需要經(jīng)過兩個步驟,首先將查詢結(jié)果轉(zhuǎn)成XML數(shù)據(jù),然后通過XML數(shù)據(jù)轉(zhuǎn)成json
XML轉(zhuǎn)JSON的存儲過程如下:
CREATE PROCEDURE [dbo].[SerializeJSON] (
@XML XML,
@json_xml NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
DECLARE @XMLString NVARCHAR(MAX);
SET @XMLString = CAST(@XML AS NVARCHAR(MAX));
BEGIN TRY--//開始捕捉異常
DECLARE @JSON NVARCHAR(MAX);
DECLARE @Row VARCHAR(MAX);
DECLARE @RowStart INT;
DECLARE @RowEnd INT;
DECLARE @FieldStart INT;
DECLARE @FieldEnd INT;
DECLARE @KEY VARCHAR(MAX);
DECLARE @Value VARCHAR(MAX);
DECLARE @StartRoot VARCHAR(100);
SET @StartRoot = '<row>';
DECLARE @EndRoot VARCHAR(100);
SET @EndRoot = '</row>';
DECLARE @StartField VARCHAR(100);
SET @StartField = '<';
DECLARE @EndField VARCHAR(100);
SET @EndField = '>';
SET @RowStart = CHARINDEX(@StartRoot, @XMLString, 0);
SET @JSON = '';
WHILE @RowStart>0
BEGIN
SET @RowStart = @RowStart + LEN(@StartRoot);
SET @RowEnd = CHARINDEX(@EndRoot, @XMLString, @RowStart);
SET @Row = SUBSTRING(@XMLString, @RowStart, @RowEnd - @RowStart);
SET @JSON = @JSON + '{';
--//for each row
SET @FieldStart = CHARINDEX(@StartField, @Row, 0);
WHILE @FieldStart>0
BEGIN
--//parse node key
SET @FieldStart = @FieldStart + LEN(@StartField);
SET @FieldEnd = CHARINDEX(@EndField, @Row, @FieldStart);
DECLARE @end INT = CHARINDEX('/>', @Row, @FieldStart);
IF @end<1
OR @end>@FieldEnd
BEGIN
SET @KEY = SUBSTRING(@Row, @FieldStart, @FieldEnd - @FieldStart);
SET @JSON = @JSON + '"' + @KEY + '":';
--//parse node value
SET @FieldStart = @FieldEnd + 1;
SET @FieldEnd = CHARINDEX('</', @Row, @FieldStart);
SET @Value = SUBSTRING(@Row, @FieldStart, @FieldEnd - @FieldStart);
SET @JSON = @JSON + '"' + @Value + '",';
END;
SET @FieldStart = @FieldStart + LEN(@StartField);
SET @FieldEnd = CHARINDEX(@EndField, @Row, @FieldStart);
SET @FieldStart = CHARINDEX(@StartField, @Row, @FieldEnd);
END;
IF LEN(@JSON)>0
SET @JSON = SUBSTRING(@JSON, 0, LEN(@JSON));
SET @JSON = @JSON + '},';
--// for each row
SET @RowStart = CHARINDEX(@StartRoot, @XMLString, @RowEnd);
END;
IF LEN(@JSON)>0
SET @JSON = SUBSTRING(@JSON, 0, LEN(@JSON));
--//SET @JSON = '[' + @JSON + ']';
SET @json_xml = @JSON;
END TRY--//結(jié)束捕捉異常
BEGIN CATCH--//有異常被捕獲
SET @json_xml = @XMLString;
END CATCH;--//結(jié)束異常處理
END;
以上所述是小編給大家介紹的SqlServer將查詢結(jié)果轉(zhuǎn)換為XML和JSON,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
在IDEA上面連接Sql?Server數(shù)據(jù)庫教程(親測有用)
這篇文章主要給大家介紹了關(guān)于在IDEA上面連接Sql?Server數(shù)據(jù)庫的相關(guān)資料,Idea的還有個強(qiáng)大之處就是連接數(shù)據(jù)庫,就可以少開一個數(shù)據(jù)庫工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
SQL 復(fù)合查詢條件(AND,OR,NOT)對NULL值的處理方法
在SQL的3值邏輯下,一個查詢條件可以產(chǎn)生以下三種情況:TRUE,FALSE,NULL。只有那些滿足WHERE子句的值是TRUE的記錄才出現(xiàn)在結(jié)果表中。2011-04-04
數(shù)據(jù)庫中布爾值(true和false)的存儲方式示例詳解
這篇文章主要介紹了多種數(shù)據(jù)庫中布爾值的存儲類型,包括TINYINT、BOOLEAN/BOOL、BIT和CHAR/VARCHAR,并討論了每種類型的特點(diǎn)、適用場景以及選擇布爾值存儲類型時需要考慮的因素,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
SQL?Server時間轉(zhuǎn)換3種方法總結(jié)
SQL?Server中處理日期和時間的常用方法有三種:FORMAT、CONVERT和DATEADD,這篇文章主要介紹了SQL?Server時間轉(zhuǎn)換的3種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09

