Sql server Reporting Services-使用UNION ALL T-SQL更改字符串长度

Sql server Reporting Services-使用UNION ALL T-SQL更改字符串长度,sql-server,sql-server-2008,tsql,reporting-services,reporting,Sql Server,Sql Server 2008,Tsql,Reporting Services,Reporting,我有一个数据源从一个查询返回两行,一个字符串为8个字符,另一个字符串为11个字符。我非常确定其中一个字符串有8个字符,因为我显式地将它放在where条件下(类似于这样。where name='ftcc_ppp')。事实是reporting services正在添加一些额外的空白字符,并将字符串的长度固定到最大值(没有where条件的所有结果集的长度字符串) 我想做一些过滤器,结果是错误的,因为字符串不是8个字符,而是11个字符(8+3blank) where条件在子查询中完成,该字段中有一行8个

我有一个数据源从一个查询返回两行,一个字符串为8个字符,另一个字符串为11个字符。我非常确定其中一个字符串有8个字符,因为我显式地将它放在where条件下(类似于这样。where name='ftcc_ppp')。事实是reporting services正在添加一些额外的空白字符,并将字符串的长度固定到最大值(没有where条件的所有结果集的长度字符串)

我想做一些过滤器,结果是错误的,因为字符串不是8个字符,而是11个字符(8+3blank)

where条件在子查询中完成,该字段中有一行8个字符,另一行11个字符(ftcc_ppp和ftcc_ppp_lx)

为什么报告服务会这样做?有什么解释吗

谢谢大家

编辑:查询代码:

BEGIN

DECLARE @dtDate DATETIME
DECLARE @lastDay DATE;
DECLARE @firstDay DATE;
DECLARE @currentDate DATE;
DECLARE @month_table AS TABLE(DATA DATE);

SET @dtDate     =  @DATA;
SET @lastDay    =  CAST(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0))  AS DATE)
SET @firstDay   =  DATEADD(d,-DAY(@dtDate)+1,@dtDate);
SET @currentDate = @firstDay;

WHILE @currentDate <> dateadd(d,1,@lastDay)
BEGIN
        PRINT @currentDate;
        INSERT INTO @month_table VALUES(@currentDate);
        SET @currentDate = dateadd(d,1,@currentDate);
END

         SELECT * FROM (

        SELECT DATA,motivo,SUM(total) AS total,CAST(campanha AS VARCHAR(11)) AS campanha,[TYPE]
        FROM [Client].[dbo].[ftcc_ppp_motivo_nelegivel_totais]
        GROUP BY DATA,motivo,campanha,[TYPE]   

        UNION ALL      

        SELECT DATA,motivo,0 AS total,CAST('ftcc_ppp' AS VARCHAR(11)) campanha,'LOP' AS [TYPE]
        FROM @month_table
        CROSS JOIN dbo.ftcc_ppp_motivo_nelegivel_keys

        UNION ALL
        SELECT DATA,motivo,0 AS total,CAST('ftcc_ppp' AS  VARCHAR(11)) campanha,'ALOP' AS [TYPE]
        FROM @month_table
        CROSS JOIN dbo.ftcc_ppp_motivo_nelegivel_keys

        UNION ALL
        SELECT DATA,motivo,0 AS total,CAST('ftcc_ppp_lx' AS VARCHAR(11)) campanha,'CARD' AS [TYPE]
        FROM @month_table
        CROSS JOIN dbo.ftcc_ppp_motivo_nelegivel_keys
    ) xpto
        WHERE campanha = 'ftcc_ppp'


END
开始
声明@dtDate-DATETIME
在最后一天宣布;
宣布第一天的日期;
声明@currentDate;
将@month_表声明为表(数据日期);
设置@dtDate=@DATA;
将@lastDay=CAST(DATEADD(s,-1,DATEADD(mm,DATEDIFF(m,0,@dtDate)+1,0))设置为日期)
设置@firstDay=DATEADD(d,-DAY(@dtDate)+1,@dtDate);
设置@currentDate=@firstDay;
而@currentDate dateadd(d,1,@lastDay)
开始
打印@currentDate;
在@month_表中插入值(@currentDate);
设置@currentDate=dateadd(d,1,@currentDate);
结束
从中选择*(
选择数据、motivo、SUM(总计)作为总计、CAST(campanha作为VARCHAR(11))作为campanha[类型]
来自[客户].[dbo].[ftcc\U ppp\U motivo\U nelegivel\U totais]
按数据分组,莫蒂沃,坎潘哈,[类型]
联合所有
选择数据,motivo,0作为总计,CAST('ftcc_ppp'作为VARCHAR(11))campanha,'LOP'作为[类型]
从@month_表
交叉连接dbo.ftcc_ppp_motivo_nelegivel_键
联合所有
选择数据,motivo,0作为总计,CAST('ftcc_ppp'作为VARCHAR(11))campanha,'ALOP'作为[类型]
从@month_表
交叉连接dbo.ftcc_ppp_motivo_nelegivel_键
联合所有
选择数据,motivo,0作为总计,CAST('ftcc_ppp_lx'作为VARCHAR(11)),campanha,'CARD'作为[类型]
从@month_表
交叉连接dbo.ftcc_ppp_motivo_nelegivel_键
)xpto
其中campanha='ftcc_ppp'
结束
我发现了问题!!:)

问题出在硬编码字符串中。 显然,硬编码字符串是一种字符类型。所以我有一个字符和8加上一个字符和11

结果明显是11个字符

在SQL Server中使用Le(),因为SQLServer自动删除空白字符,所以找不到空白空格。在编辑SQLServer内部的行时,游标向我显示空白。好教训:)

谢谢大家花时间来解决我的问题

第一次使用StackOverflow是一种乐趣

谢谢大家。
问候。

另一个可能的原因:检查数据库兼容性级别。如果设置为80,您可能会有问题,但90(或更高?)则不会

根据:

可变长度列和固定长度列的并集 生成固定长度的列


这对我来说毫无意义。你能发布一些代码,特别是你的查询吗?我怀疑您的SQL查询正在更改长度。将
LEN(FieldName)
添加到SQL查询中,以查看SQL是否认为这些长度不同。我没有看到SSR将字符附加到字符串中。是的,我可以提供完整的代码。我现在发现的一件奇怪的事情是,从sqlserver返回的len总是8,但是如果我在ReportingServices表达式中使用len,它有时会给我8,有时会给我11。源代码:如果将SELECT*FROM更改为SELECT xpto.*,rtrim(campanha)campanha\u rt FROM,SSRS中的campanha\u rt长度是多少?SSRS中始终为8。我在表中添加了一行,len为16,我认为现在“ftcc_ppp”将返回16(获得最大行len),但它返回11。在rtrim中,SSR始终返回8。对这种行为有何解释?