Don’t Sweat the Small Stuff()

I used to always see the STUFF function in passing when reading blogs and kind of move past it without understanding what it was doing. I would see it used and think it’s doing something with a bunch of stuff and kind of skip over it since it wasn’t entirely relevant to what else I was reading. When I read about what the STUFF function actually does, it made a lot more sense as a name. More than dealing with “a bunch of stuff” the STUFF function is used for stuffing a string into another string. Let’s check out a few examples of stuffing data.

Not the Thanksgiving Kind

Here’s a pretty straightforward example. What if we want to remove MS in a string and insert the word Microsoft instead? We can use the STUFF function to do that:

SELECT STUFF('This is an example in MS SQL Server.', 23 , 2, 'Microsoft') AS 'EndString';
GO

We go to position 23 in the initial string, specify that we want to remove 2 characters, and then stuff the string with Microsoft. STUFF can be used with variables as well. We can do the following to get the same result as above:

DECLARE @IntialString AS VARCHAR(50) = 'This is an example in MS SQL Server.';
DECLARE @InsertString AS VARCHAR(50) = 'Microsoft';

SELECT STUFF(@IntialString, 23 , 2, @InsertString) AS 'EndString';
GO

Save the Date

You may come across a table that stores dates as VARCHAR or CHAR. Let’s pick some important dates and look at an example of making the date more readable.

CREATE TABLE Holiday
(
	ID INT IDENTITY(1,1),
	H_Date VARCHAR(8)
);

INSERT INTO Holiday
VALUES ('20210101'),('20210404'),('20211031'),('20211225')

SELECT H_Date FROM Holiday;
GO

What if we want to see the dates with hyphens instead of all numbers:

SELECT STUFF(STUFF(H_Date, 5, 0, '-'), 8, 0, '-') as 'FormattedDate'
FROM Holiday;
GO

Keep it Comma Separated

Many times I’ve seen STUFF used to combine values into a comma separated list. Let’s create another table and populate it with a few values:

CREATE TABLE Sport
(
	ID INT IDENTITY(1,1),
	S_Name VARCHAR(15)
);

INSERT INTO Sport
VALUES ('Hockey'),('Basketball'),('Football'),('Baseball')

SELECT * FROM Sport;
GO

If we want to display our sports as a comma separated list, we can use FOR XML PATH:

SELECT STUFF((
			SELECT ',' + S_Name
			FROM Sport
			FOR XML PATH('')
			), 1, 1, '') AS SportComma
FROM Sport
WHERE ID = 1;
GO

We add the WHERE ID = 1 to get only one row returned instead of a row for each of the four values.

If you see that long script just to get a comma separated list and think it’s too complicated, you’re not alone. Thankfully, SQL Server 2017 includes a function called STRING_AGG to make this simple. Using the same data, we can get the same comma separated list result with this query:

SELECT STRING_AGG(S_Name, ',') AS SportAgg
FROM Sport;
GO

From what I’ve seen, STRING_AGG looks nicer and will perform better as well.

Thanks for reading!

One thought on “Don’t Sweat the Small Stuff()”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s