A Recipes table with a Labels column of type xml: Mint Tea has two labels, Garden Salad three, Plain Rice an empty Labels element, Berry Smoothie one, and Bread and Butter has NULL because nobody has looked yet

Add an XML Column to a Table: One Row, Many Related Values

To add an XML column to a table, use ALTER TABLE with the xml data type, and each row can then carry a list of related values. This post adds a Labels column to a Recipes table, fills it, checks that bad XML is refused, and asks questions with value() and exist(). It then builds the same data as a child table and compares what each design can enforce. Every result comes from SQL Server 2025.

Read More
A string passed to EXEC runs as a statement and returns 5 rows, while EXEC with a parameter fails with Msg 102 and sp_executesql with a parameter returns the 2 Smith rows

Run a String as SQL: EXEC, Parameters and Four Traps

To run a string as SQL, you pass it to EXEC or to sp_executesql, and SQL Server runs the text as a statement. This post builds a string from pieces, shows why EXEC cannot take parameters, and adds them with sp_executesql. It also shows four traps: a variable the string cannot see, a NULL that empties the string, a variable that is too short, and a function that cannot run a string. Every result comes from SQL Server 2025.

Read More
Two shop tables merged into one: with INT keys the merge stops at Msg 2627 after 3 of 5 rows because both shops have orders 1 and 2, and with GUID keys all 5 rows arrive

Introduction to GUIDs: Merge Tables Without Key Clashes

An introduction to GUIDs starts with one problem: two tables that both count from 1. This post merges two small shop tables, first with INT keys and then with UNIQUEIDENTIFIER keys, and shows how to create, read and sort GUIDs. It also answers common reader questions: adding GUIDs, finding the newest row and getting the new key back. Every result comes from SQL Server 2025.

Read More
The join path of the tea shop: Customer and Orders on the left of the anchor table OrderLine, Product on its right, and a row count of 12 after each join that drops to 9 for Oregon and 8 for October

Query Writing Strategy: Start From the Question, Then Build Outward

A good query writing strategy starts before you type SELECT: write the question down, find the tables that hold the answer, and build the query one table at a time. This post follows that plan on a small tea shop database with four tables, checks the row count after every join, and confirms the answer by a second route. Every result comes from SQL Server 2025.

Read More