- Simple Queries (4)
- Setting criteria using WHERE (5)
- Calculations (7)
- Calculations using dates (4)
- Basic joins (8)
- More exotic joins (2)
- Aggregation and grouping (8)
- Views (5)
- Subqueries (5)
- Stored procedures (5)
- Variables (8)
- Parameters and return values (11)
- Testing conditions (1)
- Looping (3)
- Scalar functions (6)
- Transactions (5)
- Creating tables (5)
- Temporary tables and table variables (9)
- Table-valued functions (6)
- Derived tables and CTEs (13)
- Dynamic SQL (4)
- Pivots (2)
- Triggers (2)
- Archived (70)
SQL | Table-valued functions exercise | A complicated multi-statement table-valued function!
This exercise is provided to allow potential course delegates to choose the correct Wise Owl Microsoft training course, and may not be reproduced in whole or in part in any format without the prior written consent of Wise Owl.
You can learn how to do this exercise if you attend one of more of the courses listed below!
You need a minimum screen resolution of about 700 pixels width to see our exercises. This is because they contain diagrams and tables which would not be viewable easily on a mobile phone or small laptop. Please use a larger tablet, notebook or desktop computer, or change your screen resolution settings.
First (if you haven't already done so) run the script shown above to generate the Doctor Who training database.
You'll find this exercise much easier to do if you have access to the following scalar functions:
|fnCompanions||EpisodeId||A comma-delimited list of the companions in this episode|
|fnEnemies||EpisodeId||A comma-delimited list of the enemies in this episode|
You may have already created these as part of a (much) earlier exercise on variables; otherwise, this should be your first task!
Write a function (the one in the answer is called fnSilly, for reasons which will become apparent) which takes two arguments:
|@CompanionName||Part or all of a companion name||Wilf|
|@EnemyName||Part or all of an enemy name||Ood|
The easiest way to describe what your function should return is by example. If you run this SQL:
-- show episodes featuring either Wilfred Mott or The Ood
SELECT * FROM dbo.fnSilly('wilf','ood')
Then you should see this:
There are 2 episodes featuring Wilf, and 4 featuring the Ood (although one of the episodes is the same in each case).
The important thing to notice is that where an episode is selected by reason of its companion, the Appearing column shows a comma-delimited list of the companions appearing in the episode; where it is selected by reason of its enemy, the Appearing column shows a comma-delimited list of the enemies appearing in the episode.
Still bored? You could always work out how to combine the companions and enemies in the Appearing column for a duplicated episode, to avoid it appearing twice in the list (this isn't included in the answer!).
Optionally, save your query as Getting silly.sql, then close it down.