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?
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