Parsing A Delimited String In SQL Server

Facebooktwitterredditpinterestlinkedinmail

At some point in your life, you’ve probably had to parse a string inside SQL Server. Maybe you had a comma delimited string and you need the data inside a table. So, you go to stackoverflow and find some stored procedure that someone made that you don’t understand. It works, but yuck. Well… those days are over! In SQL 20016 they introduced a new table-valued function called STRING_SPLIT. This makes is very easy to parse a comma delimited string in SQL Server.

 
STRING_SPLIT Basics
The STRING_SPLIT function is really easy to use. It basically just takes 2 parameters. The first parameter is the string that you want to parse. The second parameter is the delimiter for parsing on.

The STRING_SPLIT function will always return a one column result set with a column named value.

Here’s an example of how to use it:

SELECT	value AS AnimalName
FROM	STRING_SPLIT('Dog,Cat,Bird,Walrus', ',')

[table width=”150″ colwidth=”150″ colalign=”left”]
value
Dog
Cat
Bird
Walrus
[/table]

 
If your input string has spaces by the delimiter, you just need to trim the value that you get from the function. Here’s an example of trimming the spaces and also parsing on a pipe character:

SELECT	value AS AnimalName
FROM	STRING_SPLIT('Dog |Cat |Bird | Walrus', '|')

 
 
Source: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

Compressing Data In SQL Server

Facebooktwitterredditpinterestlinkedinmail

In SQL Server 2016 they added a sweet new featured to allow you to compress input strings and binaries. The new COMPRESS function allows the field or literal value passed in to the function to be compressed in GZip format.

 
COMPRESS
The COMPRESS function will take in an input and compress it using a GZip compression. The output from the function is a VARBINARY datatype. You can display that in a SQL Server Management window or store it in a table with a VARBINARY(MAX) field. To use the COMPRESS function, you need to pass in either VARCHAR, BINARY, VARBINARY, or CHAR datatypes.

 
How To Use The COMPRESS Function
For this example, I’m going to put the data in to a table variable. If you have a permanent table structure, you can use that instead.

DECLARE	@InsertTest TABLE
	(AnimalName VARCHAR(50),
	 AnimalStats VARBINARY(MAX))

INSERT
INTO	@InsertTest
VALUES	('Dog', 
		 COMPRESS('Height: 26 inches; Weight: 20 pounds; Color: Brown'))

SELECT	*
FROM	@InsertTest

If you’re looking to compress some data just inside SQL Server Management Studio, you can just do this:

SELECT	COMPRESS('this is the data I want to compress') AS CompressedData

 
 
How To Decompress Your Data

So now that you’ve compressed data, how to do you decompress it? As you guessed, SQL Server also added a DECOMPRESS function. It’s just as simple as the COMPRESS function, just with one little twist. The DECOMPRESS function only returns the datatype VARBINARY(MAX). You will have to cast it in to whatever you want. Here’s an example using the same script as we used above:

DECLARE	@InsertTest TABLE
	(AnimalName VARCHAR(50),
	 AnimalStats VARBINARY(MAX))

INSERT
INTO	@InsertTest
VALUES	('Dog', 
		 COMPRESS('Height: 26 inches; Weight: 20 pounds; Color: Brown'))

SELECT	*
FROM	@InsertTest


SELECT	CAST(DECOMPRESS(AnimalStats) AS VARCHAR(250)) AS DecompressedAnimalStats
FROM	@InsertTest

You can see above that I just wrapped the DECOMPRESS function with a CAST function. It’s that simple to get it in the format that you want.

 
Something To Keep In Mind: Compressed data can’t be indexed! Sorry!

Something Else To Keep In Mind: If the goal is to compress all the data in a row/table/data page/or index, SQL Server (as of 2016) now supports this using a different built-in method. So you don’t have to do it all manually.

Requires A Singleton?

Facebooktwitterredditpinterestlinkedinmail

Have you ever got this error message when you tried to parse an XML string in SQL Server?

XQuery [value()]: ‘value()’ requires a singleton (or empty sequence), found operand of type ‘xdt:untypedAtomic *’

DECLARE	@XMLToParse  XML
 
-- Load the XML data in to a variable to work with.
-- This would typically be passed as a parameter to a stored proc
SET		@XMLToParse =	'
								Baboon
						 '

SELECT	
@XMLToParse.value('data(/Animal/AnimalName)', 'VARCHAR(MAX)') AS AnimalName

 
How do we fix this?

This error is saying that the value() function needs an xpath that only exits once (non-repeating node). You and I know that there will only be one instance of , but SQL Server does not know that. To solve this, we just need to tell SQL Server that it should use the first instance of this AnimalName node that it finds. We do this by added the [1] tag to the xpath. We want to add it after the closing parentheses. This will tell SQL Server to grab whatever is the first node with that name.

DECLARE	@XMLToParse  XML
 
-- Load the XML data in to a variable to work with.
-- This would typically be passed as a parameter to a stored proc
SET		@XMLToParse =	'
								Baboon
						 '

SELECT	
@XMLToParse.value('data(/Animal/AnimalName)[1]', 'VARCHAR(MAX)') AS AnimalName
-- Notice the [1] on the line above!

 
Extra Fun

If there are multiple nodes with the same name in your XML, you can adjust the number inside the square braces to match whatever node you want. For example:


	Baboon
	Cat
	Dog 

[1] would return Baboon
[2] would return Cat
[3] would return Dog

SQL Server LIKE With Percent Literal

Facebooktwitterredditpinterestlinkedinmail

The LIKE operator in SQL Server is a really powerful tool. It allows you to specify a pattern to match records in your where clause. You can use the % (percent) as a wildcard value. For example: ‘monk%’ will match ‘monkey’ and ‘monkeys’. But what if you want to match the words ‘60% off sale’ and ‘60% off sales’… you can’t just put ‘60% off sale%’… you need to escape the first %. SQL Server gives us two different ways to escape a special character.

 
SQL Server LIKE – Exact Single Character

The first way that you can do this is by specifying a specific single character in your pattern. This is done by wrapping the single character in [ ]. The character that you put inside the brackets will tell the system that that character must be found exactly as appears.

SELECT	SaleDescription
FROM	SaleInfo
WHERE	SaleDescription LIKE '60[%] off sale%'

 
SQL Server LIKE – Escape Character (read at the bottom of this post to find out what an escape character is)

The second way that you can do this is by specifying an escape character. This is done by using the keyword ESCAPE after your pattern. The literal value of the wildcard character following the escape value will be used instead of the wildcard value. In the example below, we specify that ! is our ESCAPE character in our string. Then we put ! before %. That way the database will look for the literal value of % instead of using that in the wildcard pattern.

SELECT	SaleDescription
FROM	SaleInfo
WHERE	SaleDescription LIKE '60!% off sale%' ESCAPE '!'

 
What Is An Escape Character

An escape character is a character that is placed before a character (or string of characters) and it tells the system to read the following character as their literal value. Many systems have reserved characters that act as codes or wildcards in their system. Using an escape character, you tell the system to not read those values as special codes or wildcards.

 
Reference: https://msdn.microsoft.com/en-us/library/aa933232(v=sql.80).aspx

SQL Server Minus Operator

Facebooktwitterredditpinterestlinkedinmail

The MINUS operator is an Oracle operator and does not exist in SQL Server. SQL Server has its own operator that does this called EXCEPT. The usage of these two operators are the same between Oracle and SQL Server.

 
The EXCEPT Operator
The EXCEPT operator will take two queries and only show the records in the first query that do not exist in the second query. Here is an example of how this would work.

SELECT	A.AnimalName,
		AT.AnimalTypeName
FROM	Animal A
INNER	JOIN AnimalType AT ON AT.AnimalTypeID = A.AnimalTypeID

EXCEPT

SELECT	EA.AnimalName,
		AT.AnimalTypeName
FROM	ExtinctAnimal EA
INNER	JOIN AnimalType AT ON AT.AnimalTypeID = EA.AnimalTypeID

 
The above query will show all the animals from the Animal table where the animals are not in the ExtinctAnimal table.

 
 
Reference: https://msdn.microsoft.com/en-us/library/ms188055.aspx