2016-12-17 26 views
1

我是新來這個SQL服務器編碼打印許多資料,我的問題是如何從一個單一的變量

所以在這個ID_Order包含來自ID_Menu許多數據,如O001的例子ID_Order可以像許多數據M001,M002,M003,M004,M005

select @MenuID = ID_Menu from OrderDetail where ID_Order = @ID_Order 

但後來當我打印

print @MenuID 

它只能打印M005 是它可以打印所有的M001,M002的,E TC?

回答

1

您需要通過它來聲明一個遊標並循環:

Declare @MenuID varchar(100) 

Declare curOrderDetail cursor local for 
select ID_Menu from OrderDetail where ID_Order = @ID_Order 

Open curOrderDetail 

Fetch next from curOrderDetail into @MenuID 

While (@@fetch_status = 0) 
Begin 
    print @MenuID 
    Fetch next from curOrderDetail into @MenuID 
End 

Close curOrderDetail 
Deallocate curOrderDetail 
1

這裏不需要循環機制。試試這個下面

DECLARE @MENUID VARCHAR(MAX)=''; 
select @MenuID = @MENUID+ID_Menu+',' from OrderDetail where ID_Order = @ID_Order 

--Removing last comma ',' with substring function. 
SELECT @MENUID= SUBSTRING(@MENUID, 1, LEN(@MENUID)-1) 

PRINT @MENUID 

說明:

這裏您在打印@MENUID如何而來的M005 M001從,M002,M003,M004,M005來了?因爲它是在最後階段。這意味着它已經在循環內部將值存儲在變量@MENUID中。現在通過在循環跳轉到集合中的下一個值之前捕獲它自己來實現這一訣竅。

另一種方式StuffFOR XML PATH('')做的。堆棧溢出有很多答案。

--STUFF Used to remove first comma ',' 
--For xml path used to generate comma concatenated xml. 

SELECT @MENUID=STUFF ((Select ','+ID_Menu from OrderDetail 
where ID_Order = @ID_Order FOR XML PATH('')), 1,1,'') 
) 

PRINT @MENUID; 
0
DECLARE @MenuID VARCHAR(Max) 

SELECT @MenuID = COALESCE(@MenuID + ',', '') + CAST(ID_Menu AS VARCHAR) 
FROM OrderDetail 

SELECT @MenuID 

您還可以使用COALESCECSV

相關問題