【问题标题】: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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多