【问题标题】:SSRS automatically aliasing a subquery column using FOR XMLSSRS 使用 FOR XML 自动为子查询列起别名
【发布时间】:2014-10-28 17:26:14
【问题描述】:

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

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

1234

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

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

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

如何防止 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() 函数中为子查询添加别名,从而导致字段本身出现额外的垃圾。

【问题讨论】:

  • 给该列一个别名定义,SSRS不会觉得有必要为你创建一个。
  • 如何在列中添加别名。请这是列(CourseModule AS varchar(20))
  • 嗯...STUFF((...) AS CourseModule?
  • 这就像重复 ssrs 已经在做的事情,但现在用更长的单词
  • 我不希望它有别名,我想要的只是列不显示 , 1, 2 , 3, 4 ,而不是仅仅显示,1,2,3,4

标签: sql-server reporting-services


【解决方案1】:

我认为 cmets 最初存在一些混淆:问题不在于给列一个别名,问题是为什么 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

【讨论】:

  • 乐于助人。正如@aaronbertrand 和 billinkc 建议的那样,请检查使用存储过程的想法。我还建议您查看我对原始问题所做的编辑:使用更简洁的代码格式(使用缩进和回车)和更详细的解释可以避免很多混淆。有关更多提示,请参阅how to ask a good question
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
相关资源
最近更新 更多