Question

I have a function that usually returns one value. However, when there are multiple rows that it could return, it returns a comma-delimited string of all of the values. I'm new to using functions, so I'm wondering how it does this? Is it looping through? Doesn't the SELECT statement only run once? Here is my code:

CREATE FUNCTION dbo.list_of_cities (@fruit VARCHAR(10))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @output VARCHAR(1000)
    SELECT @output = ISNULL(@output + ', ', '') + stores_table.city
    FROM fruits_table INNER JOIN stores_table
    ON fruits_table.store = stores_table.store
    WHERE fruit = @fruit
    RETURN @output
END

Basically I want this function to return a list of all the cities that a fruit is sold in. The fruits_table has two columns: fruit and store. The stores_table has two columns: store and city. Most of the time, this will return only one city, but sometimes a fruit is sold in multiple stores, meaning this would return multiple rows. How exactly is this function concatenating the rows into a comma-delimited string? The function works fine, but I'm just curious why/how it's doing this.

Was it helpful?

Solution

The select statement runs only once, but because you have a calculated definition in the query, it evaluates it for each row. As it assigns on each row too, the value of @output changes as it does so, and you get the complete comma separate list.

OTHER TIPS

You have a select with an assignment (@output = @output+...) So every row returned is appending a new result to the @output variable (because the value of @output is re-referenced in the right-hand value).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top