我是这个sql-server编码的新手,我的问题是
所以在这个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等?
答案 0 :(得分: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 :(得分: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
中。现在通过在循环跳转到集合中的下一个值之前捕获它本身来完成这个技巧。
使用Stuff
FOR 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;
答案 2 :(得分:0)
DECLARE @MenuID VARCHAR(Max)
SELECT @MenuID = COALESCE(@MenuID + ',', '') + CAST(ID_Menu AS VARCHAR)
FROM OrderDetail
SELECT @MenuID
您还可以将COALESCE
用于CSV