2016-12-17 77 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

相关问题