如何从单个变量打印许多数据

时间:2016-12-17 07:22:56

标签: sql-server stored-procedures

我是这个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等?

3 个答案:

答案 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