SQL Server : compare two JSON String to find the difference - json

I've not worked JSON that much but a client has asked for a report to see the difference between two columns in a log table (there is 30 tables all together).
The columns I'm interested are originalRecord and newRecord in the log table.
Each column holds all the JSON objects from a screen, lets say 30 text fields, drop down lists etc. The originalRecord holds the record before the change, and newRecord after the update.
An example, status change from Open to Closed, originalRecord has all 30+ fields and status "Open" and newRecord has all 30+ fields and status "Closed"
I'm trying to find a way I can compare ALL JSON Objects for a record and the difference between the two columns.
I know JSON_VALUE can compare a JSON Object such as
IIF(JSON_VALUE(OriginalRecord, '$.status')<> '', NULL, JSON_VALUE(NewRecord, '$.status'))
but I don't want to hardcode every object like above as they do change over time.

Related

Use a another table's column's value as the name of a table in a join statement

First, I'll ask the question:
Is it possible to make a value's type 'dynamic' by creating different tables with different value types and use a simple join query to fetch the correct table based on the type specified in a column?
Here is the context:
I'm building a sort of page builder where I want the "modules" to be dynamic in the sense that I can create new modules without having to modify the database in any way.
I envision 4 entities:
A field, which represents a single value of a specific type, for example a text field or a checkbox;
An entry type, which represents a group of fields to be used for an entry. For example, Article = Title + Content + Image.
An entry, which is the content defined by the corresponding entry type.
A value, which contains the data for one field for one entry, defined by the field's value type.
For the 'value' entity, I was planning on using multiple tables for each "type of value". "value_text", "value_integer", "value_boolean", etc.
What I wanted to do (and I think it's an anti-pattern in relational database) was to grab a value in the fields table to select the proper "value" table.
Here is an image of the structure I envisioned:
(imgur) UML Diagram of DB
So I'm looking for a way to make a single query to fetch the correct value for each field of a specific entry (by ID).
This means I have to access the assigned entry_type, fetch all the fields related to that entry_type, then fetch the value of each of those fields from the value tables based on the column 'value_type' of the fields table.
If this is possible, how can I achieve this? If it's not possible, what would be the best way to tackle this problem:
Make a first query to retrieve the fields, then a query for each field to grab the correct value? This makes a lot of queries to get the values of a single entry...
Modify the structure of the database to a more efficient set of relations, taking into account everything is dynamic...
Get rid of the idea of using mutiple "value types" and stick to using a more common everything-is-serialized-text approach.
Also, as this is one of my first questions on StackOverflow, please let me know if I asked incorrectly and how I should formulate this in the future.
Thanks for all of you who even take the time to read this :)

MS-Access - Append Query - Carry MVF

Before I start I need to say I know multi-valued fields are a bad way to store data. However, because of the data and what it will be used for it seemed the easiest way and this problem has been bugging me for a short while
I am building a database that has multiple different tables based on Candidates and their specialized job sector
I have multiple queries that take data from one table to another depending on inputted values
I have a table called TblClient, which holds all the client names
I have a table called TblCandidateSupport, within this table, I have a lookup field that holds multiple values from TblClient (only needed so I can see which candidate has been to which clients)
The problem I am having is when I run an append query to the values stored in the multi-valued field to another table called TblCandidateSupportAvailable.
I either get an error "An INSERT INTO query cannot contain a multi-valued field" or only get one value appending when I use.value.
The value that is appended from the TblCandidate will only ever be viewed.
What is the best way to carry the data across?

use a multi-line variable array in a SSRS report

I have a large data set that holds the names and addresses of our customers. I need to allow the user to search this data set, however the user rarely has the key field necessary to make the search easy. They do however have three key values that will get them a reasonable subset to work with. They have the customer's last name, street and zip code. While this does not assure a single match, for the most part I should be in the less than 10 returns range. I am guessing most will only return 1 value.
I would like to have the user submit multiple lines of the three values and then return the appropriate values to user. I am looking at putting a new value in my table that has the three values concatenated, but I would have approximately 19 MM rows of data affected. I was wondering if there was some way with SSRS to submit an array variable with the three fields and then return multiple lines based on the values?
I am using SQL Server 2012 as the database.
Yes like BishNabo wrote, In your SQL just add the below structure with your field and table names. I've wrapped #var in wildcards to allow for partial values. This format requires all three to be submitted by the user.
Where tbl.fld_LName LIKE '%#LastName%' and tbl.fld_StreetName LIKE '%#Street%' and tbl.fld_ZipCode LIKE '%#Zip%'
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d6952bd0-af17-403f-8402-02759a9517fb/execute-tsql-on-ssrs-2012-with-3-parameters?forum=transactsql

SSIS - Reuse Ole DB source when matching Fact against lookup table twice

I am pretty new to SSIS and BI in general, so first of all sorry if this is a newbie question.
I have my source data for the fact table in a csv, so I want to match the ids against the surrogate keys in lookup tables.
The data structure in the csv is like this
... userId, OriginStationId, DestinyStationId,..
What I am trying to accomplish is to match the data against my lookup table. So what I am doing is
Reading Lookup data using OLE DB Source
Reading my csv file
Sorting both inputs by the same field
Doing a left join by Id, in order to get the SK
This way, if there is no match (aka can't find the surrogate key) I can redirect that to a rejected csv and handle it later.
something like this:
(sorry for the spanish!)
I am doing this for each dimension, so I can handle each one with different error codes.
Since OriginStationId and DestinyStationId are two values from the same dimension (they both match against the same lookup table), I wanted to know if there's a way to avoid reading two times the data from the table (I mean, not to use two ole db sources to read twice the data from the same table).
I tried adding a second output to the sort but I am not allowed to. The same goes to adding another output from OLE DB Source.
I see there's an "cache option", is the best way to go ? (Although it would impy creating anyway another OLE DB source.. right?)
The third option I thought of was joining by the two fields, but since there is only one field in the lookup table (the same field) I am getting an error when I try to map both colums from my csv against the same column in my Lookup table
There are columns missing with the sort order 2 to 2
What is the best way to go for this ?
Or I am thinking something incorrectly ?
If something was not clear let me know and I'll update my question
Any time you wish you could have multiple outputs from a component that only allows one, all you have to do is follow that component with the Multicast component, whose sole purpose is to split a Data Flow stream into multiple outputs.
Gonzalo
I have just used this article on how to derive columns for a data warehouse building:- How to Populate a Fact Table using SSIS (part 1).
Using this I built a simple package that reads a CSV file with two columns that are used to derive separate values from the same CodeTable. The CodeTable has two fields Id and Description.
The Data Flow has two "Lookup" tasks. The first one joins the attribute Lookup1 against the Description to derive its Id. The second joins the attribute Lookup2 against the Description to derive a different Id.
Here is the Data Flow:-
Note the "Data Conversion" was required to convert the string attributes from the CSV file into "Unicode string [DT_WSTR]" so they could be joined to the nvarchar(50) description attribute in the table.
Here is the Data Conversion:-
Here is the first Lookup (the second one joins "Copy of Lookup2" to the Description):-
Here is the Data Viewer output with the to two derived Ids CodeTableFirstId and CodeTableSecondId:-
Hopefully I understand your problem and this is of use to you.
Cheers John

Calculation query in Access produces null result all the time

I am trying to create a community database in Access (2003 preferably). Part of the main table has several fields relating to personal relationships, with field names such as "Partner", Child_LT_16", Child_GT_16", "Parent", "Sibling" etc. On the entry form each of these fieldu can have a number entered for the number of each kind of relation. Each field is defined as "Integer". The entry and normal display via a form is OK for this basic operation. However I now want to have an additional field to be ised on Forms and Reports that show the total number of relations for each record.
I have constructed a query, with a calculated field of the form
Total_Relations:[Partner]+[Child_LT_16]+[Child_GT_16]+[Parent]+[Sibling]
This query doesn't throw any errors and runs without problems, BUT it doesn't return any value for any record. In all cases the Total_Relations column stays blank (empty).
It is as though the query engine is seeing all the field values as EITHER empty (some are empty others have values usually between 1 and 3, virtually all have a numeriacl value somewhere in the various relations fields) OR taking the field value as text and giving it a NULL value (but the fields are defined as Integers.
I have tried various things including using VAL([Partner]) etc. in case the fields were being taken as Text. In this case any record that had any NULL field threw-up an error message, only records where all relevent fiels had numeric values did not throw the error, but they still did't show a total (or any) value either.
I have tried recreating the query gain, from scratch, several time, but with the same result each time
I have done this type of calculation loads of time before without problem, but this one has me climbing upm the walls.
Any suggestions from anyone?
PLEASE............
In MS Access, if you add two (or more) values together and any one of them is null, then the result is null.
You need to check is each value null, or make the fields not null-able, so there will be zero values in there if nothing is entered.
Have a look at this for working with Nulls in MSAccess, Tip #5 is the one you want