6

I have a column inside my SQL Server 2012 table which contains following Json data.

[{"bvin":"145a7170ec1247cfa077257e236fad69","id":"b06f6aa5ecd84be3aab27559daffc3a4"}]

Now I want to use this column data in my query like

select * 
from tb1 
left join tb2 on tb1.(this bvin inside my column) = tb2.bvin.

Is there a way to query JSON data in SQL Server 2012?

9
  • Are you running this query in studio manager or an app. If it is an app then what programming language?
    – w0051977
    Commented May 18, 2014 at 15:24
  • I am running this in SQL Server 2012. I need this in my stored procedure.
    – isumit
    Commented May 18, 2014 at 15:28
  • Do you have admin access to make changes to SQL Server? Commented May 18, 2014 at 15:41
  • 1
    @isumit consider writing a Scalar-valued function to return the JSON element value you're looking for. Nonetheless, that's a potentially expensive join.
    – bvj
    Commented May 19, 2014 at 4:57
  • 1
    possible duplicate of Parse JSON in TSQL
    – bummi
    Commented Jun 25, 2015 at 7:13

3 Answers 3

7

Honestly, this is a terrible architecture for storing the data, and can result in some serious performance issues.

If you truly don't have control to change the database, you can accomplish this by parsing out the value with SUBSTRING like below, but it's leading down a very unhappy path:

SELECT *
FROM tb1
JOIN tb2 on tb2.bvin = 
    SUBSTRING(
        tb1.json
        ,CHARINDEX('"bvin":"', tb1.json) + LEN('"bvin":"')
        ,CHARINDEX('"', tb1.json, CHARINDEX('"bvin":"', tb1.json) + LEN('"bvin":"')) - CHARINDEX('"bvin":"', tb1.json) - LEN('"bvin":"')
    )

And sadly, that's as easy as it can be.

6
  • 1
    What architecture is terrible for storing the data?
    – bvj
    Commented May 19, 2014 at 4:50
  • Thanks @arserbin3 !! As i can't restructure or modify database here, so using SUBSTRING here solved the purpose.
    – isumit
    Commented May 19, 2014 at 9:57
  • 5
    @bvj: storing a foreign key in a varchar column of json data, where it has to be parsed before joining tables, vastly complicates queries, and removes the ability to index it. And joining tables on varchar is also much slower than an int
    – arserbin3
    Commented May 19, 2014 at 11:26
  • 2
    @arserbin3 I know the question author was asking for Sql Server 2012, but just wanted to point out that PostgreSQL allows indexing and querying of Json in an efficient manner.
    – marknuzz
    Commented Apr 22, 2015 at 19:09
  • 1
    JSON functions are now included in Sql Server 2016: msdn.microsoft.com/en-us/magazine/mt797647.aspx
    – boateng
    Commented Sep 13, 2017 at 19:06
6

Another solution is JSON Select which providers a JsonNVarChar450() function. Your example would be solved like so:

select * 
from tb1 
left join tb2 on dbo.JsonNVarChar450(tb1.YourColumnName, 'bvin') = tb2.bvin

as someone mentioned, this could be a bit slow, however you could add an index using the JSON Select function like so:

alter table tb2 add
bvin as dbo.JsonNVarChar450(YourColumnName, 'bvin') persisted

go

create index IX_tb2_bvin on tb2(bvin)

And from then on you can query using the index over the computed column bvin, like so:

select * 
from tb1 
left join tb2 on tb1.bvin = tb2.bvin

DISCLOSURE: I am the author of JSON Select, and as such have an interest in you using it :)

2
  • This looks like an interesting library. Is there a script I can run to install it? I don't really like the .exe approach...
    – Denis
    Commented Mar 15, 2017 at 19:09
  • Hi @denis, the installer ensures that CLR integration is enabled and then installs the assembly via SQL statement execution. Of course it is possible to just do it via a script but I don't have a pre-made one that I can give you at this point. If you're worried about what it does you could use sql server profiler to see what statements get executed during an install. Commented Mar 17, 2017 at 21:20
3

Please vote for the feature here. In workaround section there you can find links to function-based solutions: http://www.sqlservercentral.com/articles/JSON/68128/ and https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

in your case you need to merge all values from this column to create an array and then apply the workaround functionality mentioned above to create a table. however, I do NOT think this is a solution as it will be very slow. Maybe you could separate those values into separate columns in time of inserting(insert stored proc or backend method, maybe trigger.. not sure about your access rights)

1
  • 4
    You don't need to vote anymore. JSON will be available in Sql Server 2016 CTP3.
    – Jovan MSFT
    Commented Sep 23, 2015 at 21:35

Not the answer you're looking for? Browse other questions tagged or ask your own question.