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.

The answer to the exercise will be included and explained if you attend the Wise Owl course listed below!

Category ==> SQL  (115 exercises)
Topic ==> Table-valued functions  (6 exercises)
Level ==> Harder than average
Course ==> Advanced SQL
Before you can do this exercise, you'll need to download and unzip this file (if you have any problems doing this, click here for help).

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:

Function Argument Returns
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:

Argument Heading 2 Example
@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: 

List of episodes

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.

This page has 0 threads Add post