2012-08-08 4 views
5

Hier ist meine SQL-Abfrage.Was kann ich anstelle von #Temp-Tabelle in SQL-Funktion verwenden

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 [email protected] + '<br/>' 
     Set @[email protected] + 1   


END 
DROP TABLE #Temp 

RETURN @ProductList 

END 
GO 

Ich muss in #Temp Tabelle Schleife. Hast du noch andere Vorschläge?

Antwort

16

Anstelle der temporären Tabelle können Sie eine Tabellenvariable verwenden.

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

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

Aber Sie könnten Ihre Funktion ohne eine Schleife neu schreiben.

So etwas sollte tun, was Sie wollen.

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 
Verwandte Themen