SSRS使用FOR XML自动使子查询列别名化

时间:2014-10-28 17:26:14

标签: sql-server reporting-services

我有一个针对SQL Server数据库运行的查询。其中一列使用STUFF()函数。

当我在SQL编辑器窗口中运行查询时,结果值如下所示:

1234

当我尝试在SSRS报告中使用此查询时,SSRS会自动在STUFF()函数中放置一个列别名,从而产生如下所示的值:

<Expr1>, 1</Expr1><Expr1>, 2</Expr1><Expr1>, 3</Expr1><Expr1>, 4</Expr1>

两者之间的唯一区别是,当我在SSRS中保存查询时,术语&#34; AS Expr1&#34;自动添加(参见下面的代码)。

如何防止SSRS自动添加此别名并按原样运行查询?

   SELECT 
        FirstName, 
        LastName, 
        CourseTitle,
        LastLoginDate,
        NoOfModules,
        COUNT(CourseCompleted) AS ModulesStarted,
        STUFF(
          (
            SELECT ','  + CAST(CourseModule AS varchar(20)) -- SSRS puts "AS Expr1" here
            FROM EDSF 
            WHERE 
                FirstName = e.FirstName AND 
                LastName = e.LastName AND 
                Coursecompleted = '1' AND 
                CourseTitle = e.CourseTitle
            FOR XML PATH('')
          ),1,1,''
         ) AS CoursesCompleted
    FROM EDSF  e
    WHERE 
        Coursecompleted = '1' OR 
        Coursecompleted = '0'
    GROUP BY 
        FirstName, 
        LastName, 
        CourseTitle,
        LastLoginDate,
        NoOfModules;
编辑:代码已经重新排列,问题重新编写以使问题更加清晰。我没有对返回的列本身产生别名的问题:相反,SSRS实际上是在我的STUFF()函数中向子查询添加别名,从而导致字段内的额外垃圾。

1 个答案:

答案 0 :(得分:11)

我认为最初的评论中存在一些混淆:问题不在于为列提供别名,问题是为什么SSRS不允许STUFF()命令中的子查询在没有别名的情况下存在。 XML正在解释它并在字段值本身中包含列名,将“1”,“2”,“3”和“4”的输入转换为(格式化为代码,因为它被解释为HTML):

"<Expr1>, 1</Expr1><Expr1>, 2</Expr1><Expr1>, 3</Expr1><Expr1>, 4</Expr1>" 

我很确定有一种方法可以告诉FOR XML忽略列名,而且我也很确定存储过程选项是一种更好的方法。尽管如此,有时存储过程不是一个选项,所以我将包括一种用REPLACE()

来消除违规值的方法。
SELECT 
    FirstName,
    LastName,
    CourseTitle,
    lastlogindate,
    Noofmodules, 
    COUNT(Coursecompleted) AS modulesstarted,
    REPLACE(REPLACE(REPLACE('<' + 
      STUFF((
        SELECT ','  + CAST(CourseModule AS varchar(20)) AS Expr1
        FROM Esdf 
        WHERE 
            FirstName = e.FirstName
            AND LastName = e.LastName
            AND Coursecompleted = '1'
            AND CourseTitle = e.CourseTitle
        FOR XML PATH('')),1,1,''
      ), '<Expr1>', ''), '</Expr1>', '') , ',', ''
     ) AS CoursesCompleted
FROM Esdf  e
WHERE 
    Coursecompleted = '1' OR
    Coursecompleted = '0'
GROUP BY 
    FirstName, 
    LastName, 
    CourseTitle,
    lastlogindate, 
    Noofmodules