16

これが私のSQLクエリです。

CREATE FUNCTION UF_GetOrderProducts
(
    @OrderId int
)
RETURNS VARCHAR(500)
AS
BEGIN
    SELECT  Identity(int,1,1) ID, ProductId INTO #Temp  FROM OrderProduct WHERE OrderId = @OrderId

Declare @Id int,
        @Count int,
        @LoopCount int,
        @ProductList VARCHAR(500),
        @ProductListTemp VARCHAR(500)

SET @Count = (Select Count(*) From #Temp)

SET @LoopCount = 1
 SET @ProductList = ''
WHILE @LoopCount <= @Count
BEGIN



     SET @ProductListTemp =( SELECT Name FROM Product WHERE ProductId =(Select ProductId from #Temp Where ID = @LoopCount))
       SET @ProductList +=@ProductListTemp + '<br/>'
       Set @LoopCount=@LoopCount + 1         


END
DROP TABLE #Temp

RETURN @ProductList

END
GO

#Temp Table でループする必要があります。他に提案はありますか?

4

1 に答える 1

35

一時テーブルの代わりに、テーブル変数を使用できます。

declare @Temp TABLE (ID int identity, ProductId int)

insert into @Temp(ProductId)
select ProductId 
from OrderProduct
where OrderId = @OrderId

しかし、ループなしで関数を書き直すことができます。

このようなものは、あなたが望むことをするはずです。

create function IF_GetOrderProducts
(
  @OrderId int
)
returns varchar(500)
as
begin
  return
    (
    select Name+'<br/>'
    from Product as P
      inner join OrderProduct as OP
        on P.ProductId = OP.ProductId
    where OP.OrderId = @OrderId
    for xml path(''), type
    ).value('.', 'varchar(500)')
end
于 2012-08-08T06:18:34.317 に答える