Microsoftãé·å¹Žã«ããã£ãŠæ¥µç«¯ããæ¥µç«¯ãžãšç±çããŠãããšããå°ããã€ããªãã¯ããã«æ
£ãå§ããç¹å®ã®æçå¿ãæã£ãŠæ°ãããã®ãåŸ
ã£ãŠããŸãã æéãçµã€ã«ã€ããŠããã®ææ
ã¯åŒ·ããªããç¡æèã®ãã¡ã«è¯ããã®ã¯æåŸ
ããŸããã
ããããæã«ã¯ãã¹ãŠãæ£å察ã«ãªãããšããããŸãã
ãã€ã¯ããœãã㯠ããã¹ãŠã®ç¢ºç«ããã人çã®ã¹ãã¬ãªã¿ã€ããæã¡ç Žãå®å
šã«æ©èœããæ©èœãç®±ããåºããŠããŸãã ããªãã¯æ°ããæ©èœããæ¬¡ã®ã¬ãŒããæåŸ
ããŠããŸãããæ¯åãããããŸãã«ããªããé·å¹Žæ¬ ããŠãããã®ã§ããããšã«ãŸããŸãæ°ã¥ããŸãã
é·ãéã
Microsoft Connectã§
SQL Serveräžã®
JSONãæäœãããµããŒããæãäžè¬çãªæ©èœã®1ã€ã§ãã£ãããããã®ããã¹ã®å°å
¥ã«ã¯ããã€ãã®çç±ããããŸãã æ°å¹Žãçµã¡ãäºæ³å€ã«ããã®æ©èœã¯
SQL Server 2016ã®ãªãªãŒã¹ãšå
±ã«å®è£
ãããŸããã å°æ¥çã«ã¯éåžžã«ããŸããã£ããšèšããŸããã
Microsoftã¯ããã§æ¢ãŸããã
SQL Server 2017ã§ã¯æ¢ã«é«éãª
JSONããŒãµãŒã®ããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åããŸããã
å
容ïŒ
1.
ããŒã¿å2.
ã¹ãã¬ãŒãž3.
å§çž®/è§£å4.
å§çž®5.
ColumnStore6.
JSONãäœæãã7.
JSONã確èªãã8.
JsonValue9.
OpenJson10.
æååã®åå²11.
ç·©ã12.
倿Ž13.
æé»ã®å€æ14.
ã€ã³ããã¯ã¹15.
ããŒãµãŒã®ããã©ãŒãã³ã¹ãããª1.ããŒã¿å
SQL Serverã§ã® JSONãµããŒã
ã¯ãæåã¯ãã¹ãŠã®ãšãã£ã·ã§ã³ã§å©çšã§ããŸãã åæã«ã
XMLã®å Žåã®ããã«ã
Microsoftã¯åå¥ã®ããŒã¿åãæäŸããŸããã§ããã
SQL Serveräžã®
JSONã®ããŒã¿ã¯ãã¬ãŒã³ããã¹ããšããŠä¿åãããŸãïŒ
Unicode ïŒ
NVARCHAR / NCHAR ïŒãŸãã¯
ANSI ïŒ
VARCHAR / CHAR ïŒåœ¢åŒã
DECLARE @JSON_ANSI VARCHAR(MAX) = '[{"NÄ
me":"LenÅvo ã¢ã460"}]' , @JSON_Unicode NVARCHAR(MAX) = N'[{"NÄ
me":"LenÅvo ã¢ã460"}]' SELECT DATALENGTH(@JSON_ANSI), @JSON_ANSI UNION ALL SELECT DATALENGTH(@JSON_Unicode), @JSON_Unicode
çæãã¹ãäž»ãªããšã¯ããã®ããŒã¿åãŸãã¯ãã®ããŒã¿åãã©ãã ãã®ã¹ããŒã¹ã䜿çšãããã§ãïŒ
UnicodeãšããŠããŒã¿ãä¿åããå Žåã¯1æåããã2ãã€ãã
ANSIæååã®å Žåã¯1ãã€ãïŒã ãŸãã
Unicode宿°ã®åã«ã
N ãã眮ãããšãå¿ããªãã§ãã ããã ããã§ãªããã°ãããªãã¯ããããã®æ¥œããç¶æ³ã«åºãããããšãã§ããŸãïŒ
ãã¹ãŠãã·ã³ãã«ã«æããŸãããéããŸãã ããã«ãéžæããããŒã¿åããµã€ãºã ãã§ãªããè§£æé床ã«ã圱é¿ããããšãããããŸãã
ããã«ã
éæšå¥šã®ããŒã¿å
-NTEXT / TEXTã䜿çšããªãããšã匷ããå§ãããŸãã ç¿æ
£ã®ããã«ãŸã ãããã䜿çšãã人ã®ããã«ãç§ãã¡ã¯å°ããªèª¿æ»å®éšãè¡ããŸãïŒ
DROP TABLE IF EXISTS
åŸè
ã®å Žåã®æ¿å
¥é床ã¯å€§ããç°ãªããŸãã
varchar: CPU time = 32 ms, elapsed time = 28 ms nvarchar: CPU time = 31 ms, elapsed time = 30 ms ntext: CPU time = 172 ms, elapsed time = 190 ms
ãŸãã
NTEXT / TEXTã¯åžžã«
LOBããŒãžã«ä¿åãããããšã«æ³šæããŠãã ããã
SELECT obj_name = OBJECT_NAME(p.[object_id]) , a.[type_desc] , a.total_pages , total_mb = a.total_pages * 8 / 1024. FROM sys.allocation_units a JOIN sys.partitions p ON p.[partition_id] = a.container_id WHERE p.[object_id] IN ( OBJECT_ID('#nvarchar'), OBJECT_ID('#ntext'), OBJECT_ID('#varchar') )
obj_name type_desc total_pages total_mb
åç
§çšã«ãå¯å€é·ã¿ã€ãã®
SQL Server 2005ããããããŒã¿ãä¿åããããŒãžãã«ãŒã«ã倿ŽãããŸããã äžè¬ã«ããµã€ãºã8060ãã€ããè¶
ããå ŽåãããŒã¿ã¯
LOBããŒãžã«é
眮ãããããã§ãªãå Žåã¯
IN_ROWã«æ ŒçŽãã
ãŸã ã ãã®å Žåã
SQL ServerãããŒãžäžã®ããŒã¿ã®ã¹ãã¬ãŒãžãæé©åããããšã¯æããã§ãã
ãããŠã
NTEXT / TEXTã䜿çšããªãæåŸã®çç±ã¯ãéæšå¥šã®ããŒã¿åãå«ããã¹ãŠã®
JSON颿°ãé¢çœããªããšããäºå®ã§ãã
SELECT TOP(1) 1 FROM
Msg 8116, Level 16, State 1, Line 63 Argument data type ntext is invalid for argument 1 of isjson function.
2.ã¹ãã¬ãŒãž
XMLãšããŠæç€ºãããåæ§ã®ããŒã¿ãšæ¯èŒããŠã
JSONã
NVARCHAR / VARCHARãšããŠä¿åããããšã®å©ç¹ãèŠãŠã¿ãŸãããã ããã«ã
XMLããã€ãã£ã圢åŒã§ä¿åããæååãšããŠè¡šç€ºããããšããŸãã
DECLARE @XML_Unicode NVARCHAR(MAX) = N' <Manufacturer Name="Lenovo"> <Product Name="ThinkPad E460"> <Model Name="20ETS03100"> <CPU>i7-6500U</CPU> <Memory>16</Memory> <SSD>256</SSD> </Model> <Model Name="20ETS02W00"> <CPU>i5-6200U</CPU> <Memory>8</Memory> <HDD>1000</HDD> </Model> <Model Name="20ETS02V00"> <CPU>i5-6200U</CPU> <Memory>4</Memory> <HDD>500</HDD> </Model> </Product> </Manufacturer>' DECLARE @JSON_Unicode NVARCHAR(MAX) = N' [ { "Manufacturer": { "Name": "Lenovo", "Product": { "Name": "ThinkPad E460", "Model": [ { "Name": "20ETS03100", "CPU": "Intel Core i7-6500U", "Memory": 16, "SSD": "256" }, { "Name": "20ETS02W00", "CPU": "Intel Core i5-6200U", "Memory": 8, "HDD": "1000" }, { "Name": "20ETS02V00", "CPU": "Intel Core i5-6200U", "Memory": 4, "HDD": "500" } ] } } } ]' DECLARE @XML_Unicode_D NVARCHAR(MAX) = N'<Manufacturer Name="Lenovo"><Product Name="ThinkPad E460"><Model Name="20ETS03100"><CPU>i7-6500U</CPU><Memory>16</Memory><SSD>256</SSD></Model><Model Name="20ETS02W00"><CPU>i5-6200U</CPU><Memory>8</Memory><HDD>1000</HDD></Model><Model Name="20ETS02V00"><CPU>i5-6200U</CPU><Memory>4</Memory><HDD>500</HDD></Model></Product></Manufacturer>' , @JSON_Unicode_D NVARCHAR(MAX) = N'[{"Manufacturer":{"Name":"Lenovo","Product":{"Name":"ThinkPad E460","Model":[{"Name":"20ETS03100","CPU":"Intel Core i7-6500U","Memory":16,"SSD":"256"},{"Name":"20ETS02W00","CPU":"Intel Core i5-6200U","Memory":8,"HDD":"1000"},{"Name":"20ETS02V00","CPU":"Intel Core i5-6200U","Memory":4,"HDD":"500"}]}}}]' DECLARE @XML XML = @XML_Unicode , @XML_ANSI VARCHAR(MAX) = @XML_Unicode , @XML_D XML = @XML_Unicode_D , @XML_ANSI_D VARCHAR(MAX) = @XML_Unicode_D , @JSON_ANSI VARCHAR(MAX) = @JSON_Unicode , @JSON_ANSI_D VARCHAR(MAX) = @JSON_Unicode_D SELECT * FROM ( VALUES ('XML Unicode', DATALENGTH(@XML_Unicode), DATALENGTH(@XML_Unicode_D)) , ('XML ANSI', DATALENGTH(@XML_ANSI), DATALENGTH(@XML_ANSI_D)) , ('XML', DATALENGTH(@XML), DATALENGTH(@XML_D)) , ('JSON Unicode', DATALENGTH(@JSON_Unicode), DATALENGTH(@JSON_Unicode_D)) , ('JSON ANSI', DATALENGTH(@JSON_ANSI), DATALENGTH(@JSON_ANSI_D)) ) t(DataType, Delimeters, NoDelimeters)
å®è¡ãããšã次ã®çµæãåŸãããŸãã
DataType Delimeters NoDelimeters
æé©ãªãªãã·ã§ã³ã¯ãã€ãã£ã
XMLã®ããã«æãããããããŸããã ããã¯éšåçã«ã¯çå®ã§ããã埮åŠãªéãããããŸãã
XMLã¯åžžã«
UnicodeãšããŠä¿åãã
ãŸã ã ããã«ã
SQL Serverã¯ãã®ããŒã¿ã®ä¿åã«ãã€ããªåœ¢åŒã䜿çšããŠããããããã¹ãŠããã€ã³ã¿ãŒã䜿çšããŠæšæºåãããèŸæžã«å§çž®ãããŸãã ãã®ãããXMLå
ã®æžåŒèšå®ã¯ããŒã¿ã®æçµãµã€ãºã«åœ±é¿ããŸããã
æååã§ã¯ããã¹ãŠãç°ãªãããããã©ãŒãããããã
JSONãä¿åããããšã¯ãå§ãããŸããã æè¯ã®ãªãã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ãã§æ¢ã«ãªã³ããã³ãã§ããŒã¿ãä¿åããã³ãã©ãŒããããããšãã«äœåãªæåããã¹ãŠåãåãããšã§ãã
JSONããŒã¿ã®ãµã€ãºãããã«åæžãããå Žåã¯ãããã€ãã®ãªãã·ã§ã³ããããŸãã
3.å§çž®/è§£å
SQL Server 2016ã§ã¯ã
GZIPå§çž®ã®ãµããŒãã远å ããæ°ãã
COMPRESS / DECOMPRESSæ©èœãå°å
¥ãããŸããã
SELECT * FROM ( VALUES ('XML Unicode', DATALENGTH(COMPRESS(@XML_Unicode)), DATALENGTH(COMPRESS(@XML_Unicode_D))) , ('XML ANSI', DATALENGTH(COMPRESS(@XML_ANSI)), DATALENGTH(COMPRESS(@XML_ANSI_D))) , ('JSON Unicode', DATALENGTH(COMPRESS(@JSON_Unicode)), DATALENGTH(COMPRESS(@JSON_Unicode_D))) , ('JSON ANSI', DATALENGTH(COMPRESS(@JSON_ANSI)), DATALENGTH(COMPRESS(@JSON_ANSI_D))) ) t(DataType, CompressDelimeters, CompressNoDelimeters)
åã®äŸã®çµæïŒ
DataType CompressDelimeters CompressNoDelimeters
ãã¹ãŠãããŸãå§çž®ãããŠããŸããã1ã€ã®æ©èœãèŠããŠããå¿
èŠããããŸãã æåã«ããŒã¿ã
ANSIã§åä¿¡ããããã®åŸå€æ°ã®åã
Unicodeã«å€æŽããããšä»®å®ã
ãŸã ã
DECLARE @t TABLE (val VARBINARY(MAX)) INSERT INTO @t VALUES (COMPRESS('[{"Name":"ThinkPad E460"}]'))
COMPRESS颿°ã¯ã
ANSI / Unicodeã«å¯ŸããŠç°ãªããã€ããªã·ãŒã±ã³ã¹ãè¿ããŸãããã®åŸã®èªã¿åãæã«ãããŒã¿ã®äžéšã
ANSIãšããŠä¿åãããäžéšã
Unicodeã§ä¿åãããç¶æ³ãçºçã
ãŸã ã ãã®å Žåãã©ã®åã«ãã£ã¹ãããããæšæž¬ããããšã¯éåžžã«å°é£ã§ãã
ããŒããããã·ã¹ãã ãæ§ç¯ããå Žåã
COMPRESS颿°ã䜿çšãããšæ¿å
¥ãé
ããªããŸãã
USE tempdb GO DROP TABLE IF EXISTS
ãããŠããã¯éåžžã«éèŠã§ãïŒ
NoCompress: CPU time = 15 ms, elapsed time = 25 ms Compress: CPU time = 218 ms, elapsed time = 280 ms
ãã®å ŽåãããŒãã«ãµã€ãºã¯çž®å°ãããŸãã
SELECT obj_name = OBJECT_NAME(p.[object_id]) , a.[type_desc] , a.total_pages , total_mb = a.total_pages * 8 / 1024. FROM sys.partitions p JOIN sys.allocation_units a ON p.[partition_id] = a.container_id WHERE p.[object_id] IN ( OBJECT_ID('#Compress'), OBJECT_ID('#NoCompress') )
obj_name type_desc total_pages total_mb
ããã«ãå§çž®ããŒã¿ããŒãã«ããèªã¿åããšã
DECOMPRESSæ©èœã倧å¹
ã«é
ããªããŸãã
SET STATISTICS IO, TIME ON SELECT * FROM
è«çèªã¿åãå€ã¯æžå°ããŸãããå®è¡é床ã¯éåžžã«äœããªããŸãã
Table 'NoCompress'. Scan count 1, logical reads 187, ... CPU time = 16 ms, elapsed time = 37 ms Table 'Compress'. Scan count 1, logical reads 79, ... CPU time = 109 ms, elapsed time = 212 ms
ãŸãã¯ã
PERSISTEDèšç®åã远å ã§ããŸãã
ALTER TABLE
ãŸãã¯ãèšç®åãäœæããããã«åºã¥ããŠã€ã³ããã¯ã¹ãäœæããŸãã
ALTER TABLE
å Žåã«ãã£ãŠã¯ããããã¯ãŒã¯ã®é
å»¶ãäžèšã®äŸãããã¯ããã«ããã©ãŒãã³ã¹ã«åœ±é¿ããããšããããŸãã ã¯ã©ã€ã¢ã³ãã§
JSON GZIPããŒã¿ã
å§çž®ããŠãµãŒããŒã«éä¿¡ã§ãããšæ³åããŠãã ããã
DECLARE @json NVARCHAR(MAX) = ( SELECT t.[name] , t.[object_id] , [columns] = ( SELECT c.column_id, c.[name], c.system_type_id FROM sys.all_columns c WHERE c.[object_id] = t.[object_id] FOR JSON AUTO ) FROM sys.all_objects t FOR JSON AUTO ) SELECT InitialSize = DATALENGTH(@json) / 1048576. , CompressSize = DATALENGTH(COMPRESS(@json)) / 1048576.
ç§ã«ãšã£ãŠããããžã§ã¯ãã®1ã€ã§ãããã¯ãŒã¯ãã©ãã£ãã¯ãåæžããããšãããšããã©ã€ãã©ã€ã³ãã«ãªããŸããã
InitialSize CompressSize
4.å§çž®
ããŒãã«ã®ãµã€ãºãå°ããããããã«ãããŒã¿å§çž®ã䜿çšããããšãã§ããŸãã 以åã¯ãå§çž®ã¯
Enterpriseãšãã£ã·ã§ã³ã§ã®ã¿å©çšå¯èœã§ããã ãã ãã
SQL Server 2016 SP1ã®ãªãªãŒã¹ã§ã¯ã
Expressã§ããã®æ©èœã䜿çšã§ããŸãã
USE AdventureWorks2014 GO DROP TABLE IF EXISTS
None: CPU time = 62 ms, elapsed time = 68 ms Row: CPU time = 94 ms, elapsed time = 89 ms Page: CPU time = 125 ms, elapsed time = 126 ms
ããŒãžã¬ãã«ã®å§çž®ã§ã¯ãã¢ã«ãŽãªãºã ã䜿çšããŠåæ§ã®ããŒã¿ã®å¡ãèŠã€ããããããããå°ããå€ã«çœ®ãæããŸãã è¡ã¬ãã«ã®å§çž®ã¯ãã¿ã€ããå¿
èŠæå°éã«åãæšãŠãäœåãªæåãåãæšãŠãŸãã ããšãã°ãåã®åã¯
INTã§4ãã€ãã§ãããããã«æ ŒçŽãããŠããå€ã¯255æªæºã§ãããã®ãããªã¬ã³ãŒãã®å Žåãåã¯åãæšãŠããããã£ã¹ã¯äžã®ããŒã¿ã¯
TINYINTã®ããã«ã¹ããŒã¹ãå æããŸãã
USE tempdb GO SELECT obj_name = OBJECT_NAME(p.[object_id]) , a.[type_desc] , a.total_pages , total_mb = a.total_pages * 8 / 1024. FROM sys.partitions p JOIN sys.allocation_units a ON p.[partition_id] = a.container_id WHERE p.[object_id] IN (OBJECT_ID('#None'), OBJECT_ID('#Page'), OBJECT_ID('#Row'))
obj_name type_desc total_pages total_mb
5. ColumnStore
ããããç§ãæãæ°ã«å
¥ã£ãŠããã®ã¯
ColumnStoreã€ã³ããã¯ã¹ã§ããããã¯ã
SQL Serverã®ããŒãžã§ã³ããšã«æ¹åãããŠã
ãŸã ã
ColumnStoreã®äž»ãªã¢ã€ãã¢ã¯ãããŒãã«å
ã®ããŒã¿ãçŽ100äžè¡
ããšã«RowGroupsã«åå²ãããã®ã°ã«ãŒãå
ã§åå
ã®ããŒã¿ãå§çž®ããããšã§ãã ããã«ããããã£ã¹ã¯å®¹éã®å€§å¹
ãªç¯çŽãè«çèªã¿åãå€ã®åæžãåæã¯ãšãªã®é«éåãå®çŸããŸãã ãããã£ãŠã
JSONæ
å ±ãå«ãã¢ãŒã«ã€ããä¿åããå¿
èŠãããå Žåãã¯ã©ã¹ã¿ãŒåããã
ColumnStoreã€ã³ããã¯ã¹ãäœæã§ããŸãã
USE AdventureWorks2014 GO DROP TABLE IF EXISTS
è¡šã®æ¿å
¥é床ã¯ãã»ãŒ
PAGEå§çž®ã«å¯Ÿå¿ããŸãã ããã«ã
COMPRESSION_DELAYãªãã·ã§ã³ã«ãããããã»ã¹ã
OLTPããŒãã«åŸ®èª¿æŽã§ããŸãã
CCI: CPU time = 140 ms, elapsed time = 136 ms
SQL Server 2017ããåã¯
ãColumnStoreã€ã³ããã¯ã¹ã¯
[N] VARCHARïŒMAXïŒããŒã¿åããµããŒãããŠããŸããã§ããããæ°ããããŒãžã§ã³ã®ãªãªãŒã¹ã«äŒŽããä»»æã®é·ãã®è¡ã
ColumnStoreã«æ ŒçŽã§ããŸãã ã
USE tempdb GO SELECT o.[name] , s.used_page_count / 128. FROM sys.indexes i JOIN sys.dm_db_partition_stats s ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id JOIN sys.objects o ON i.[object_id] = o.[object_id] WHERE i.[object_id] = OBJECT_ID('#CCI')
ããããã®å©çã¯æã
éåžžã«å°è±¡çã§ãïŒ
6. JSONãäœæãã
次ã«ã
JSONãçæããæ¹æ³ãèŠãŠã¿ãŸãããã
SQL Serverã§æ¢ã«
XMLã
䜿çšããŠããå Žåããã¹ãŠã¯é¡æšã«ãã£ãŠè¡ãããŸãã
JSONãçæããæãç°¡åãªæ¹æ³ã¯ã
FOR JSON AUTOã䜿çšããããšã§ãã ãã®å Žåããªããžã§ã¯ããã
JSONé
åãçæãããŸãã
DROP TABLE IF EXISTS
[ { "UserID":1, "UserName":"Paul Denton", "RegDate":"2029-01-23T00:00:00" }, { "UserID":2, "UserName":"JC Denton" }, { "UserID":3, "UserName":"Maggie Cho" } ]
NULLå€ã¯ç¡èŠãããããšã«æ³šæããããšãéèŠã§ãã ãããã
JSONã«å«ãããå Žåã¯ã
INCLUDE_NULL_VALUESãªãã·ã§ã³ã䜿çšã§ããŸãã
SELECT UserID, RegDate FROM
[ { "UserID":1, "RegDate":"2017-01-23T00:00:00" }, { "UserID":2, "RegDate":null }, { "UserID":3, "RegDate":null } ]
è§æ¬åŒ§ãåãé€ãå¿
èŠãããå Žåã¯ã
WITHOUT_ARRAY_WRAPPERãªãã·ã§ã³ãããã«åœ¹ç«ã¡ãŸãã
SELECT TOP(1) UserID, UserName FROM
{ "UserID":1, "UserName":"Paul Denton" }
çµæãã«ãŒãèŠçŽ ãšçµã¿åããããå Žåã
ROOTãªãã·ã§ã³ãããã«æäŸãããŸãïŒ
SELECT UserID, UserName FROM
{ "Users":[ { "UserID":1, "UserName":"Paul Denton" }, { "UserID":2, "UserName":"JC Denton" }, { "UserID":3, "UserName":"Maggie Cho" } ] }
ããè€éãªæ§é ã®
JSONãäœæããå Žåã¯ãããããã£ã«å¿
èŠãªååãå²ãåœãŠãŠã°ã«ãŒãåãã
FOR JSON PATHåŒã䜿çšããå¿
èŠããããŸãã
SELECT TOP(1) UserID , UserName AS [Detail.FullName] , RegDate AS [Detail.RegDate] FROM
[ { "UserID":1, "Detail":{ "FullName":"Paul Denton", "RegDate":"2017-01-23T00:00:00" } } ]
SELECT t.[name] , t.[object_id] , [columns] = ( SELECT c.column_id, c.[name] FROM sys.columns c WHERE c.[object_id] = t.[object_id] FOR JSON AUTO ) FROM sys.tables t FOR JSON AUTO
[ { "name":"
7. JSONã確èªãã
JSON圢åŒã®æ£ç¢ºããæ€èšŒããããã«ã
JSONã®å Žåã¯1ãè¿ããããã§ãªãå Žåã¯0ã
è¿ã ã
NULLãæž¡ãããå Žåã¯
NULLãè¿ã
ISJSON颿°ããã
ãŸã ã
DECLARE @json1 NVARCHAR(MAX) = N'{"id": 1}' , @json2 NVARCHAR(MAX) = N'[1,2,3]' , @json3 NVARCHAR(MAX) = N'1' , @json4 NVARCHAR(MAX) = N'' , @json5 NVARCHAR(MAX) = NULL SELECT ISJSON(@json1)
8. JsonValue
JSONããã¹ã«ã©ãŒå€ãæœåºããã«ã¯ã
JSON_VALUE颿°ã䜿çšã§ããŸãã
DECLARE @json NVARCHAR(MAX) = N' { "UserID": 1, "UserName": "JC Denton", "IsActive": true, "Date": "2016-05-31T00:00:00", "Settings": [ { "Language": "EN" }, { "Skin": "FlatUI" } ] }' SELECT JSON_VALUE(@json, '$.UserID') , JSON_VALUE(@json, '$.UserName') , JSON_VALUE(@json, '$.Settings[0].Language') , JSON_VALUE(@json, '$.Settings[1].Skin') , JSON_QUERY(@json, '$.Settings')
9. OpenJson
衚圢åŒããŒã¿ã®è§£æã«ã¯ã
OPENJSONè¡šé¢æ°ã
䜿çšãããŸãã ããã«ãäºææ§ã¬ãã«ã130以äžã®ããŒã¹ã§ã®ã¿æ©èœããããšã«æ³šæããŠãã ããã
OPENSONæ©èœã«ã¯2ã€ã®æäœã¢ãŒãããããŸãã æãåçŽãª-çµæã®éžæã«ã¹ããŒããæå®ããã«ïŒ
DECLARE @json NVARCHAR(MAX) = N' { "UserID": 1, "UserName": "JC Denton", "IsActive": true, "RegDate": "2016-05-31T00:00:00" }' SELECT * FROM OPENJSON(@json)
2çªç®ã®ã¢ãŒãã§ã¯ãè¿ãããçµæãã©ã®ããã«ãªããã説æã§ããŸããååããã®çªå·ãå€ã®ååŸå ŽæïŒ
DECLARE @json NVARCHAR(MAX) = N' [ { "User ID": 1, "UserName": "JC Denton", "IsActive": true, "Date": "2016-05-31T00:00:00", "Settings": [ { "Language": "EN" }, { "Skin": "FlatUI" } ] }, { "User ID": 2, "UserName": "Paul Denton", "IsActive": false } ]' SELECT * FROM OPENJSON(@json) SELECT * FROM OPENJSON(@json, '$[0]') SELECT * FROM OPENJSON(@json, '$[0].Settings[0]') SELECT * FROM OPENJSON(@json) WITH ( UserID INT '$."User ID"' , UserName SYSNAME , IsActive BIT , RegDate DATETIME '$.Date' , Settings NVARCHAR(MAX) AS JSON , Skin SYSNAME '$.Settings[1].Skin' )
ææžã«ãã¹ããããéå±€ãããå Žåãæ¬¡ã®äŸã圹ç«ã¡ãŸãã
DECLARE @json NVARCHAR(MAX) = N' [ { "FullName": "JC Denton", "Children": [ { "FullName": "Mary", "Male": "0" }, { "FullName": "Paul", "Male": "1" } ] }, { "FullName": "Paul Denton" } ]' SELECT t.FullName, c.* FROM OPENJSON(@json) WITH ( FullName SYSNAME , Children NVARCHAR(MAX) AS JSON ) t OUTER APPLY OPENJSON(Children) WITH ( ChildrenName SYSNAME '$.FullName' , Male TINYINT ) c
10.æååã®åå²
SQL Server 2016ã®ãªãªãŒã¹ã§ã
STRING_SPLIT颿°
ãç»å ŽããŸãã ã ãããŠã誰ããå®å¿ããŠããæ¯ãã€ãããä»ã§ã¯ãæååãããŒã¯ã³ã«åå²ããããã«èªè»¢è»ãçšæããå¿
èŠã¯ãªãã ãã ããå¥ã®ä»£æ¿ææ®µããããŸã
-OPENJSONæ§æã§ããããã«ã€ããŠã¯åã«æ€èšããŸããã ããã€ãã®åå²ç·ãªãã·ã§ã³ããã¹ãããŠã¿ãŸãããã
SET NOCOUNT ON SET STATISTICS TIME OFF DECLARE @x VARCHAR(MAX) = '1' + REPLICATE(CAST(',1' AS VARCHAR(MAX)), 1000) SET STATISTICS TIME ON ;WITH cte AS ( SELECT s = 1 , e = COALESCE(NULLIF(CHARINDEX(',', @x, 1), 0), LEN(@x) + 1) , v = SUBSTRING(@x, 1, COALESCE(NULLIF(CHARINDEX(',', @x, 1), 0), LEN(@x) + 1) - 1) UNION ALL SELECT s = CONVERT(INT, e) + 1 , e = COALESCE(NULLIF(CHARINDEX(',', @x, e + 1), 0), LEN(@x) + 1) , v = SUBSTRING(@x, e + 1, COALESCE(NULLIF(CHARINDEX(',', @x, e + 1), 0), LEN(@x) + 1)- e - 1) FROM cte WHERE e < LEN(@x) + 1 ) SELECT v FROM cte WHERE LEN(v) > 0 OPTION (MAXRECURSION 0) SELECT tcvalue('(./text())[1]', 'INT') FROM ( SELECT x = CONVERT(XML, '<i>' + REPLACE(@x, ',', '</i><i>') + '</i>').query('.') ) a CROSS APPLY x.nodes('i') t(c) SELECT * FROM STRING_SPLIT(@x, N',')
çµæãèŠããšã
XMLãš
CTEã®æŸèæã¯èšããŸã§ããªãã
OPENJSONãSTRING_SPLIT颿°ãããé«éã§ããå ŽåããããŸãã
500k 100k 50k 1000
ããã«ã
OLTPã®è² è·ãé«ãå Žå
ãOPENJSONãš
STRING_SPLITã® éã«æãããªéãã¯ãããŸããïŒ1000åã®å埩+ã³ã³ãã§åºåããã10åã®å€ïŒïŒ
CTE = 4629 ms XML = 4397 ms STRING_SPLIT = 4011 ms OPENJSON = 4047 ms
11.ç·©ã
SQL Server 2005以éã
XML SCHEMA COLLECTIONã䜿çšããŠããŒã¿ããŒã¹ãã
XMLãæ€èšŒããæ©äŒã
XMLã®ã¹ããŒããèšè¿°ããããã«åºã¥ããŠããŒã¿ã®æ£ç¢ºæ§ã確èªã§ããŸãã
JSONã®æç€ºçãªåœ¢åŒã§ã¯ãã®ãããªæ©èœã¯ãããŸããããåé¿çããããŸãã
ç§ãèŠããŠããéãã
JSONã«ã¯2ã€ã®ã¿ã€ãã®åŒããã
ãŸã ïŒ
strictãš
lax ïŒããã©ã«ãã§äœ¿çšïŒã éãã¯ãæ§æè§£ææã«ååšããªããã¹ãŸãã¯èª€ã£ããã¹ãæå®ãããšã
ç·©ãåŒã§ã¯
NULLãååŸããã
峿 Œãªå Žåã¯ãšã©ãŒã«ãªããšããããšã§ãã
DECLARE @json NVARCHAR(MAX) = N' { "UserID": 1, "UserName": "JC Denton" }' SELECT JSON_VALUE(@json, '$.IsActive') , JSON_VALUE(@json, 'lax$.IsActive') , JSON_VALUE(@json, 'strict$.UserName') SELECT JSON_VALUE(@json, 'strict$.IsActive')
Msg 13608, Level 16, State 2, Line 12 Property cannot be found on the specified JSON path.
12.倿Ž
JSONå
ã®ããŒã¿ã倿Žããã«ã¯ã
JSON_MODIFY颿°ããããŸãã äŸã¯éåžžã«åçŽã§ããããã詳现ã«ãã€ã³ãããŠãæå³ããããŸããã
DECLARE @json NVARCHAR(MAX) = N' { "FirstName": "JC", "LastName": "Denton", "Age": 20, "Skills": ["SQL Server 2014"] }'
13.æé»ã®å€æ
ãããŠä»ãç§ãã¡ã¯æãè峿·±ããã®ãã€ãŸãããã©ãŒãã³ã¹ã«é¢é£ããåé¡ã«åãçµã¿å§ããŠããŸãã
JSONãè§£æããå Žåãçæãã¹ãç¹ã1ã€ãã
ãŸã ãOPENJSONãš
JSON_VALUEã¯ãåå®çŸ©ããªãå Žåãçµæã
Unicodeã§è¿ããŸãã
AdventureWorksããŒã¿ããŒã¹ã§ã¯ã
AccountNumberåã®ããŒã¿åã¯
VARCHARã§ãïŒ
USE AdventureWorks2014 GO DECLARE @json NVARCHAR(MAX) = N'{ "AccountNumber": "AW00000009" }' SET STATISTICS IO ON SELECT CustomerID, AccountNumber FROM Sales.Customer WHERE AccountNumber = JSON_VALUE(@json, '$.AccountNumber') SELECT CustomerID, AccountNumber FROM Sales.Customer WHERE AccountNumber = CAST(JSON_VALUE(@json, '$.AccountNumber') AS VARCHAR(10)) SET STATISTICS IO OFF
è«çèªã¿åãå€ã®éãïŒ
Table 'Customer'. Scan count 1, logical reads 37, ... Table 'Customer'. Scan count 0, logical reads 2, ...
åãšé¢æ°ã®çµæã®éã®ããŒã¿åãäžèŽããªããšããäºå®ã«ããã
SQL Serverã¯åªå
é äœã«åºã¥ããŠæé»çãªå倿ãå®è¡ããå¿
èŠããã
ãŸã ã ãã®å Žåã
NVARCHARã« ã æ®å¿µãªãããã€ã³ããã¯ã¹åã§ã®ãã¹ãŠã®èšç®ãšå€æã¯ãã»ãšãã©ã®å Žå
IndexScanã«ã€ãªãããŸãã

åãšåæ§ã«æç€ºçã«ã¿ã€ããæå®ãããšã
IndexSeekãååŸãã
ãŸã ã

14.ã€ã³ããã¯ã¹
次ã«ã
JSONãªããžã§ã¯ãã«ã€ã³ããã¯ã¹ã
ä»ããæ¹æ³ãæ€èšããŸãã æåã«è¿°ã¹ãããã«ãXMLãšã¯ç°ãªãã
JSONã®åå¥ã®ããŒã¿åã¯
SQL Server 2016ã«è¿œå ãããŸããã§ããã ãããã£ãŠãä»»æã®æååããŒã¿åã䜿çšããŠä¿åã§ããŸãã
XMLã®çµéšããã人ã¯ã
SQL Serverã®ãã®åœ¢åŒã«ã¯ãç¹å®ã®éžæãé«éåã§ããããã€ãã®çš®é¡ã®ã€ã³ããã¯ã¹ãããããšãæãåºããŸãã
JSONãæ ŒçŽãããããšã«ãªã£ãŠããæåååã®å Žåããã®ãããªã€ã³ããã¯ã¹ã¯åã«ååšããŸããã
æ®å¿µãªãã ã
JSONBã¯é
ä¿¡ãããŸããã§ããã éçºããŒã ã¯ã
JSONæ©èœããªãªãŒã¹ãããšãã«æ¥ãã§ãããæåéãæ¬¡ã®ããã«è¿°ã¹ãŸããããé床ãè¶³ããªãå Žåã¯ã次ã®ããŒãžã§ã³ã§
JSONBã远å ããŸããã
SQL Server 2017ã®ãªãªãŒã¹ã§ã¯
ãããã¯èµ·ãããŸããã§ããã
ãããŠãããã§èšç®åã圹ç«ã¡ãŸããèšç®åã¯ã
JSONããã¥ã¡ã³ãã®ç¹å®ã®ããããã£ã§ãããæ€çŽ¢ããå¿
èŠãããããããã®åã«åºã¥ããŠã€ã³ããã¯ã¹ãäœæããå¿
èŠããããŸãã
USE AdventureWorks2014 GO DROP TABLE IF EXISTS
åãããŒã¿ãè§£æãããã³ã«ããŸãåççã§ã¯ãããŸããïŒ
SET STATISTICS IO, TIME ON SELECT * FROM
Table 'JSON'. Scan count 1, logical reads 187, ... CPU time = 16 ms, elapsed time = 29 ms
ãããã£ãŠãèšç®åã®äœæãšãã®åŸã®ã€ã³ããã¯ã¹ãžã®çµã¿èŸŒã¿ãæ£åœåãããå ŽåããããŸãã ALTER TABLE
åæã«ãSQL Serverãªããã£ãã€ã¶ãŒã¯éåžžã«ã¹ããŒãã§ãããããã³ãŒãã倿Žããå¿
èŠã¯ãããŸããã Table 'JSON'. Scan count 1, logical reads 13, ... CPU time = 0 ms, elapsed time = 1 ms Table 'JSON'. Scan count 1, logical reads 13, ... CPU time = 0 ms, elapsed time = 1 ms
ããã«ãé
åã®å
容ãŸãã¯ãªããžã§ã¯ãã®äžéšå
šäœãæ€çŽ¢ããå Žåã¯ãéåžžã®ã€ã³ããã¯ã¹ãšãã«ããã¹ãã€ã³ããã¯ã¹ã®äž¡æ¹ãäœæã§ããŸããåæã«ããã«ããã¹ãã€ã³ããã¯ã¹ã«ã¯ç¹å¥ãªJSONåŠçã«ãŒã«ã¯ãããŸãããäºéåŒçšç¬Šãã³ã³ãããã©ã±ãããåºåãæåãšããŠäœ¿çšããŠãããã¹ããåå¥ã®ããŒã¯ã³ã«åå²ããŸãããããJSONæ§é èªäœã®æ§æã§ãã USE AdventureWorks2014 GO DROP TABLE IF EXISTS dbo.LogJSON GO CREATE TABLE dbo.LogJSON ( DatabaseLogID INT , InfoJSON NVARCHAR(MAX) NOT NULL , CONSTRAINT pk PRIMARY KEY (DatabaseLogID) ) GO INSERT INTO dbo.LogJSON SELECT DatabaseLogID , InfoJSON = ( SELECT PostTime, DatabaseUser, [Event], ObjectName = [Schema] + '.' + [Object] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ) FROM dbo.DatabaseLog GO IF EXISTS( SELECT * FROM sys.fulltext_catalogs WHERE [name] = 'JSON_FTC' ) DROP FULLTEXT CATALOG JSON_FTC GO CREATE FULLTEXT CATALOG JSON_FTC WITH ACCENT_SENSITIVITY = ON AUTHORIZATION dbo GO IF EXISTS ( SELECT * FROM sys.fulltext_indexes WHERE [object_id] = OBJECT_ID(N'dbo.LogJSON') ) BEGIN ALTER FULLTEXT INDEX ON dbo.LogJSON DISABLE DROP FULLTEXT INDEX ON dbo.LogJSON END GO CREATE FULLTEXT INDEX ON dbo.LogJSON (InfoJSON) KEY INDEX pk ON JSON_FTC GO SELECT * FROM dbo.LogJSON WHERE CONTAINS(InfoJSON, 'ALTER_TABLE')
15.ããŒãµãŒã®ããã©ãŒãã³ã¹
æåŸã«ããã®èšäºã®æãè峿·±ãéšåã«ãã©ãçããŸããSQL Serveräžã®XMLãšæ¯èŒããŠJSONè§£æã¯ã©ããããé«éã§ããïŒãã®è³ªåã«çããããã«ãäžé£ã®ãã¹ããæºåããŸãããJSONããã³XML圢åŒã®2ã€ã®å€§ããªãã¡ã€ã«ãæºåããŸãã USE AdventureWorks2014 GO DROP PROCEDURE IF EXISTS
OPENJSONãOPENXMLããã³XQueryã®ããã©ãŒãã³ã¹ã確èªããŸãã SET NOCOUNT ON SET STATISTICS TIME ON DECLARE @xml XML SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'X:\sample.xml', SINGLE_BLOB) x DECLARE @jsonu NVARCHAR(MAX) SELECT @jsonu = BulkColumn FROM OPENROWSET(BULK 'X:\sample.txt', SINGLE_NCLOB) x SELECT ProductID = tcvalue('(ProductID/text())[1]', 'INT') , [Name] = tcvalue('(Name/text())[1]', 'NVARCHAR(50)') , ProductNumber = tcvalue('(ProductNumber/text())[1]', 'NVARCHAR(25)') , OrderQty = tcvalue('(OrderQty/text())[1]', 'SMALLINT') , UnitPrice = tcvalue('(UnitPrice/text())[1]', 'MONEY') , ListPrice = tcvalue('(ListPrice/text())[1]', 'MONEY') , Color = tcvalue('(Color/text())[1]', 'NVARCHAR(15)') , MakeFlag = tcvalue('(MakeFlag/text())[1]', 'BIT') FROM @xml.nodes('Products/Product') t(c) DECLARE @doc INT EXEC sys.sp_xml_preparedocument @doc OUTPUT, @xml SELECT * FROM OPENXML(@doc, '/Products/Product', 2) WITH ( ProductID INT , [Name] NVARCHAR(50) , ProductNumber NVARCHAR(25) , OrderQty SMALLINT , UnitPrice MONEY , ListPrice MONEY , Color NVARCHAR(15) , MakeFlag BIT ) EXEC sys.sp_xml_removedocument @doc SELECT * FROM OPENJSON(@jsonu) WITH ( ProductID INT , [Name] NVARCHAR(50) , ProductNumber NVARCHAR(25) , OrderQty SMALLINT , UnitPrice MONEY , ListPrice MONEY , Color NVARCHAR(15) , MakeFlag BIT ) SET STATISTICS TIME, IO OFF
ããã§ãXQueryã«å¯Ÿããã¹ã«ã©ãŒé¢æ°JSON_VALUEã®ããã©ãŒãã³ã¹ã確èªããŸãããã SET NOCOUNT ON DECLARE @jsonu NVARCHAR(MAX) = N'[ {"User":"Sergey Syrovatchenko","Age":28,"Skills":["SQL Server","T-SQL","JSON","XML"]}, {"User":"JC Denton","Skills":["Microfibral Muscle","Regeneration","EMP Shield"]}, {"User":"Paul Denton","Age":32,"Skills":["Vision Enhancement"]}]' DECLARE @jsonu_f NVARCHAR(MAX) = N'[ { "User":"Sergey Syrovatchenko", "Age":28, "Skills":[ "SQL Server", "T-SQL", "JSON", "XML" ] }, { "User":"JC Denton", "Skills":[ "Microfibral Muscle", "Regeneration", "EMP Shield" ] }, { "User":"Paul Denton", "Age":32, "Skills":[ "Vision Enhancement" ] } ]' DECLARE @json VARCHAR(MAX) = @jsonu , @json_f VARCHAR(MAX) = @jsonu_f DECLARE @xml XML = N' <Users> <User Name="Sergey Syrovatchenko"> <Age>28</Age> <Skills> <Skill>SQL Server</Skill> <Skill>T-SQL</Skill> <Skill>JSON</Skill> <Skill>XML</Skill> </Skills> </User> <User Name="JC Denton"> <Skills> <Skill>Microfibral Muscle</Skill> <Skill>Regeneration</Skill> <Skill>EMP Shield</Skill> </Skills> </User> <User Name="Paul Denton"> <Age>28</Age> <Skills> <Skill>Vision Enhancement</Skill> </Skills> </User> </Users>' DECLARE @i INT , @int INT , @varchar VARCHAR(100) , @nvarchar NVARCHAR(100) , @s DATETIME , @runs INT = 100000 DECLARE @t TABLE ( iter INT IDENTITY PRIMARY KEY , data_type VARCHAR(100) , [path] VARCHAR(1000) , [type] VARCHAR(1000) , time_ms INT ) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @int = JSON_VALUE(@jsonu, '$[0].Age') , @i += 1 INSERT INTO @t SELECT '@jsonu', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @int = JSON_VALUE(@jsonu_f, '$[0].Age') , @i += 1 INSERT INTO @t SELECT '@jsonu_f', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @int = JSON_VALUE(@json, '$[0].Age') , @i += 1 INSERT INTO @t SELECT '@json', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @int = JSON_VALUE(@json_f, '$[0].Age') , @i += 1 INSERT INTO @t SELECT '@json_f', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @int = @xml.value('(Users/User[1]/Age/text())[1]', 'INT') , @i += 1 INSERT INTO @t SELECT '@xml', '(Users/User[1]/Age/text())[1]', 'INT', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @nvarchar = JSON_VALUE(@jsonu, '$[1].User') , @i += 1 INSERT INTO @t SELECT '@jsonu', '$[1].User', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @nvarchar = JSON_VALUE(@jsonu_f, '$[1].User') , @i += 1 INSERT INTO @t SELECT '@jsonu_f', '$[1].User', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = JSON_VALUE(@json, '$[1].User') , @i += 1 INSERT INTO @t SELECT '@json', '$[1].User', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = JSON_VALUE(@json_f, '$[1].User') , @i += 1 INSERT INTO @t SELECT '@json_f', '$[1].User', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @nvarchar = @xml.value('(Users/User[2]/@Name)[1]', 'NVARCHAR(100)') , @i += 1 INSERT INTO @t SELECT '@xml', '(Users/User[2]/@Name)[1]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = @xml.value('(Users/User[2]/@Name)[1]', 'VARCHAR(100)') , @i += 1 INSERT INTO @t SELECT '@xml', '(Users/User[2]/@Name)[1]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @nvarchar = JSON_VALUE(@jsonu, '$[2].Skills[0]') , @i += 1 INSERT INTO @t SELECT '@jsonu', '$[2].Skills[0]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @nvarchar = JSON_VALUE(@jsonu_f, '$[2].Skills[0]') , @i += 1 INSERT INTO @t SELECT '@jsonu_f', '$[2].Skills[0]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = JSON_VALUE(@json, '$[2].Skills[0]') , @i += 1 INSERT INTO @t SELECT '@json', '$[2].Skills[0]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = JSON_VALUE(@json_f, '$[2].Skills[0]') , @i += 1 INSERT INTO @t SELECT '@json_f', '$[2].Skills[0]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT @i = 1, @s = GETDATE() WHILE @i <= @runs SELECT @varchar = @xml.value('(Users/User[3]/Skills/Skill/text())[1]', 'VARCHAR(100)') , @i += 1 INSERT INTO @t SELECT '@xml', '(Users/User[3]/Skills/Skill/text())[1]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE()) SELECT * FROM @t
åŸãããçµæïŒ iter data_type path type 2016 SP1 2017 RTM
ãŸãããã1ã€ã®è峿·±ããã¥ã¢ã³ã¹ããããŸããJSON_VALUEåŒã³åºããšOPENJSONåŒã³åºããæ··åšãããå¿
èŠã¯ãããŸãããããã«ãè§£æåŸã«æ¬åœã«å¿
èŠãªåã®ã¿ãæå®ããŠãã ãããC JSONã·ã³ãã«æå€§-å°ãªãããªããåãè§£æããå¿
èŠããããããéããæã
ã¯çµæãåŸãŸãïŒ SET NOCOUNT ON SET STATISTICS TIME ON DECLARE @json NVARCHAR(MAX) SELECT @json = BulkColumn FROM OPENROWSET(BULK 'X:\sample.txt', SINGLE_NCLOB) x SELECT COUNT_BIG(*) FROM OPENJSON(@json) WITH ( ProductID INT , ProductNumber NVARCHAR(25) , OrderQty SMALLINT , UnitPrice MONEY , ListPrice MONEY , Color NVARCHAR(15) ) WHERE Color = 'Black' SELECT COUNT_BIG(*) FROM OPENJSON(@json) WITH (Color NVARCHAR(15)) WHERE Color = 'Black' SELECT COUNT_BIG(*) FROM OPENJSON(@json) WHERE JSON_VALUE(value, '$.Color') = 'Black'
ç°¡åãªçµè«
- JSONããã®ããŒã¿æœåºã¯ãXMLããã®2ã10åé«éã§ãã
- å€ãã®å ŽåãJSONã¹ãã¬ãŒãžã¯XML圢åŒãããåé·ã§ãã
- JSONããŒã¿ã®UnicodeåŠçã¯5ã15ïŒ
é«éã§ãã
- JSONã䜿çšãããšããµãŒããŒCPUã®è² è·ã倧å¹
ã«åæžã§ããŸãã
- ã§ã¯SQL Serverã®2017幎ã«ã¯ãããªãã®ã¹ã«ã©ãŒå€ã®è§£æãå éJSONãã
ã¢ã€ãã³/ãœãããŠã§ã¢
Windows 8.1 Pro 6.3 x64 Core i5 3470 3.2GHz, DDR3-1600 32Gb, Samsung 850 Evo 250Gb SQL Server 2016 SP1 Developer (13.0.4001.0) SQL Server 2017 RTM Developer (14.0.1000.169)
æ å
ãã®æ
å ±ããã¹ãŠèªãã®ã¯éåžžã«é¢åãªã®ã§ããã¡ã³ããèããããã«ãæè¿ã®confïŒSQL Server 2016/2017ïŒJSONããã®ãããªããããŸãããã®ãããªã¯ãã»ãã®2ã3ã®äŸããªããããæçš¿ãšã¯ç°ãªããŸãã+ãã®èšäºãè±èªåã®èŽè¡ãšå
±æãããå ŽåïŒSQL Server 2017ïŒJSONãããŠããšãã...
ããŸããŸç§ã¯éåžžã«é·ãéèšäºãæžãããšãæå¿µããŸãããä»äºã®å€æŽã24æé幎äžç¡äŒã®2ã€ã®ãããžã§ã¯ãã1æ¯ã®ã³ã³ã¢ã«å¯Ÿãã宿çãªãã©ã¹ãã¬ãŒã·ã§ã³ãããã³ããã«GitHubã«éãããç§ãã¡èªèº«ã®ããããããžã§ã¯ãããããŠãç§ã¯åã³ã³ãã¥ããã£ãšäœãæçšãªãã®ãå
±æããæè¡æ
å ±ã®2ããŒãžä»¥äžãèªè
ãé
äºããããšããèªèã«è³ããŸãããç°¡æœãã¯ç§ã®ãã®ã§ã¯ãªãããšãç¥ã£ãŠããŸããããããæåŸãŸã§èªãã§ããã ããã°ãããã圹ã«ç«ãŠã°å¹žãã§ãããããã«ãããSQL Server 2016/2017ã§JSONã䜿çšããããªãã®äººççµéšã«ã€ããŠå»ºèšçãªã³ã¡ã³ããæè¿ããŸããæåŸã®2ã€ã®äŸã®é床ã確èªããŠãããŠããããšããJSONãçããã å¿
ãããããã»ã©éããªããåçŸæ§ãèŠã€ããã®ãé¢çœãã§ãã