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 表中循环。你有什么其他的建议?

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 回答