【问题标题】:SQL Server Reporting wrap output rowsSQL Server 报告包装输出行
【发布时间】:2009-09-24 09:52:38
【问题描述】:
使用 SQL Server Reporting Services,我想为一些订单生成包含行详细信息的报告,如下所示:
Order Details
2315 1x5432 Apple Tree, 9x912 Roses, 1x13 Spade
2316 3x12 Lawn grass
我怎样才能最有效地做到这一点,无论是使用事务 SQL 还是使用 Reporting Services 内置的东西? (我最终可能会收到 许多 个订单,因此每个订单行的调用可能会很昂贵...)
【问题讨论】:
标签:
sql-server
reporting-services
【解决方案1】:
我用 FOR XML 和 STUFF 做同样的事情
SELECT DISTINCT
Col1.Table_Name TableName,
STUFF
(
(
SELECT
', ' + CONVERT (VARCHAR, Col2.Column_name)
FROM Information_Schema.Columns Col2
WHERE Col1.Table_Name = Col2.Table_Name
ORDER BY Col2.Table_Name
FOR XML PATH('')
), 1, 2, ''
) AS ColumnNames
FROM Information_Schema.Columns Col1
【解决方案2】:
我通常用用户定义的函数解决了这类问题。
CREATE FUNCTION GetDetails (@order_id INT) RETURNS NVARCHAR(1000) AS
BEGIN
DECLARE mycursor
CURSOR READ_ONLY
FOR SELECT description
FROM OrderDetails
WHERE order_id = @order_id
DECLARE @description NVARCHAR(100)
DECLARE @return_value NVARCHAR(1000)
SET @return_value = ''
OPEN mycursor
FETCH NEXT FROM mycursor INTO @description
WHILE @@fetch_status = 0
BEGIN
SET @return_value = @return_value + @description
FETCH NEXT FROM mycursor INTO @description
IF (@@fetch_status = 0) SET @return_value = @return_value + ', '
END
CLOSE mycursor
DEALLOCATE mycursor
RETURN @return_value
END;
您的查询将是:
SELECT order_id, GetDetails(order_id) as details
FROM Order
【解决方案3】:
我使用COALESCE 解决了这个问题,灵感来自this thread:
CREATE FUNCTION GetDetails(@OrderID varchar(10))
RETURNS varchar(1000) AS
BEGIN
DECLARE @result varchar(1000), @delimiter char
SET @delimiter = ','
SELECT @result = COALESCE(@result + @delimiter, '') + Details
FROM
(
SELECT ProductNumber
, Quantity + 'x' + ProductNumber + ' ' + ProductName AS Details
FROM OrderDetail where OrderID = @OrderID
) OrderDetail
ORDER BY ProductNumber
RETURN @result
END
然后,如the answer by Jeremy Stein:
SELECT OrderId, GetDetails(OrderId) AS Details
FROM Order