3

我有一个通常返回一个值的函数。但是,当它可以返回多行时,它会返回所有值的逗号分隔字符串。我是使用函数的新手,所以我想知道它是如何做到的?它是循环的吗?SELECT 语句不是只运行一次吗?这是我的代码:

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

基本上我希望这个函数返回一个出售水果的所有城市的列表。fruits_table 有两列:水果和商店。stores_table 有两列:store 和 city。大多数情况下,这只会返回一个城市,但有时一种水果会在多个商店出售,这意味着这将返回多行。这个函数究竟如何将行连接成逗号分隔的字符串?该功能工作正常,但我只是好奇它为什么/如何这样做。

4

2 回答 2

4

select 语句只运行一次,但由于您在查询中有一个计算定义,它会为每一行计算它。由于它也在每一行上分配,因此它的值会@output发生变化,并且您会获得完整的逗号分隔列表。

于 2012-07-19T14:24:16.177 回答
1

您有一个带有赋值 ( @output = @output+...) 的选择,因此返回的每一行都将一个新结果附加到@output变量中(因为@output在右侧值中重新引用了 的值)。

于 2012-07-19T14:24:42.940 回答