2017-10-17 27 views
1

我的數據庫表中的一條記錄是一個具有超過100個鍵/值對的JSON字符串。我知道我可以做以下事情SQL Server:爲OPENJSON指定一攬子模式以創建所有鍵值對列單元格條目

SELECT * 
FROM OPENJSON(@json) 
WITH(KEY_NAME_HERE VARCHAR(1000),KEY_NAME_HERE VARCHAR(1000),KEY_NAME_HERE VARCHAR(1000)) 

然後繼續命名JSON對象中的每個鍵。有沒有辦法用默認類型來覆蓋JSON對象中的每個鍵,所以我不必在WITH子句中輸入每個單個鍵?就像

SELECT * 
FROM OPENJSON(@json) 
WITH(WILDCARD VARCHAR(1000)) 

我試過抓住默認的json表和pivoting,但遇到類似的問題。

回答

0

你可以嘗試動態地做到這一點。 我試過如下:

declare @json nvarchar(4000) = N'{ 
    "SomeVal1":"John", 
    "SomeVal2":45, 
    "SomeVal3":true, 
    "SomeVal4":false 
}' 

declare @sql nvarchar(max), @params nvarchar(100), @keys nvarchar(max) 

set @params = N'@json nvarchar(4000), @keys nvarchar(max)'; 
select @keys = stuff((select distinct ', ' + cast([key] as nvarchar(1000)) + ' nvarchar(1000) ' [text()] 
         from (select * from openjson(@json)) t 
         for xml path(''), type) 
         .value('.','nvarchar(max)'),1,2,' ') 
         from (select * from openjson(@json)) t 
--debug 
select @keys as keys 
set @sql = 'select * from openjson(@json) with (' + @keys + ')' 

--debug 
select @sql as [generated query] 

execute sp_executesql @sql, @params, @json = @json, @keys = @keys; 

出於某種原因,我無法把它通過將其添加到PARAMS定義工作,以便也@keyssp_executesql呼叫參數化的,但像他這樣它的工作原理。 無論你是否可以在場景中執行dynamic sql,這是另一個問題。

祝你好運!

相關問題