3

通常は 1 つの値を返す関数があります。ただし、返される行が複数ある場合は、すべての値のカンマ区切りの文字列を返します。私は関数の使用に慣れていないので、これがどのように行われるのだろうか? ループしていますか?SELECT ステートメントは 1 回しか実行されませんか? これが私のコードです:

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 には、果物と店舗の 2 つの列があります。store_table には、store と city の 2 つの列があります。ほとんどの場合、これは 1 つの都市のみを返しますが、果物が複数の店舗で販売されている場合があるため、複数の行が返されます。この関数は行をカンマ区切りの文字列に連結していますか? 関数は正常に動作しますが、なぜ/どのようにこれを行っているのか興味があります。

4

2 に答える 2

4

select ステートメントは 1 回だけ実行されますが、クエリに計算された定義があるため、行ごとに評価されます。各行にも割り当て@outputられるため、そのように値が変化し、完全なカンマ区切りのリストが得られます。

于 2012-07-19T14:24:16.177 に答える
1

割り当て ( @output = @output+...) を含む選択があるため、返されるすべての行は@output変数に新しい結果を追加します (の値は@output右側の値で再参照されるため)。

于 2012-07-19T14:24:42.940 に答える