經過大量搜索並將使用Web上的FOR XML和.nodes()命令轉換結果集的非常優秀的技術拼湊起來之後,我能夠創建這個單一的查詢(不是存儲過程),它將任何任意的SQL查詢轉換爲JSON數組做了相當不錯的工作。改進SQL Server查詢以將任意表轉換爲JSON
該查詢會將每個數據行編碼爲帶逗號前導的單個JSON對象。 數據行被括號括起來,然後整個結果集將被導出到一個文件。
我想看看有沒有人能看到改善其性能的方法?
下面是一個示例表查詢:
declare @xd table (col1 varchar(max), col2 int, col3 real, colNull int)
insert into @xd
select '', null, null, null
UNION ALL select 'ItemA', 123, 123.123, null
UNION ALL select 'ItemB', 456, 456.456, null
UNION ALL select '7890', 789, 789.789, null
select '[{}'
UNION ALL
select ',{' + STUFF((
(select ','
+ '"' + r.value('local-name(.)', 'varchar(max)') + '":'
+ case when r.value('./@xsi:nil', 'varchar(max)') = 'true' then 'null'
when isnumeric(r.value('.', 'varchar(max)')) = 1
then r.value('.', 'varchar(max)')
else '"' + r.value('.', 'varchar(max)') + '"'
end
from rows.nodes('/row/*') as x(r) for xml path(''))
), 1, 1, '') + '}'
from (
-- Arbitrary query goes here, (fields go where t.* is, table where @xd t is)
select (select t.* for xml raw,type,elements XSINIL) rows
from @xd t
) xd
UNION ALL
select ']'
我最大的批判它,就是它的出奇的慢。
目前大約需要3點半~42,000行。
我的另一個大的批評是,它目前假設所有看起來像數字的東西都是數字。它不嘗試發現列類型(至少我不確定它是否可以)。
最後一個小問題是,第一個數據行在前面會有一個逗號,在技術上它不應該。爲了彌補這一點,它需要在第一行中啓動JSON數組的空JSON對象。
其他的批評(最好是有解決方案的)被邀請,我唯一真正的限制是該解決方案在很多任意的SQL查詢中可以重複使用,而無需明確標識列名。
我使用SQL Server 2012的
感謝,並給其他人喜歡我,誰一直在尋找一個廣義SQL結果 - > JSON數組轉換器,盡情享受!
雖然我很讚賞你的SQL福,我要問:爲什麼?真實世界中你需要這樣做的場景是什麼?我不想在這裏消極,只是爲什麼你需要這個而感到困惑。 – 2013-02-14 00:03:12
在這種情況下,我正在尋找一種特別的方式來快速將結果集加載到NoSQL數據庫(如CouchDB)中,而無需構建大量基礎結構或將任何內容添加到我的生產SQL環境中。 Mongo,Couch等人。似乎使用JSON作爲數據傳輸的通用語言。一旦進入NoSQL數據庫,我們可以嘗試對數據集進行切片和切塊,以瞭解它們的性能。複製CouchDB數據庫以在遠程桌面,便攜式計算機,智能手機等上創建本地存儲庫比管理SQL複製基礎架構要容易得多。所以我們正在做一些盡職調查。 – 2013-02-14 00:30:10
讓我們不要在這裏被愚弄,大多數是通過搜索現有的SQL到JSON和SQL來找到鍵/值對的答案。是的,我把它放在一起,通過UNION ALL在它周圍放置了一些括號,使用case語句來處理引號更聰明一點,並開始嘗試使用XSINIL的東西(也許我甚至知道其中一些實際上是如何工作的; ))但我真的不能承認這一點。關於我最近做的唯一事情是將底部的子查詢合併爲一個XML數據集,然後讓上層查詢將其轉換爲鍵/值對。 – 2013-02-14 01:02:38