22

Here is my sql query.

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

I have to loop in #Temp Table. Do you have any other suggestions?

1 Answer 1

47

Instead of temp table you can use a table variable.

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

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

But you could rewrite your function without a loop.

Something like this should do what you want.

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.