Sql server Reporting Services-使用UNION ALL T-SQL更改字符串长度
我有一个数据源从一个查询返回两行,一个字符串为8个字符,另一个字符串为11个字符。我非常确定其中一个字符串有8个字符,因为我显式地将它放在where条件下(类似于这样。where name='ftcc_ppp')。事实是reporting services正在添加一些额外的空白字符,并将字符串的长度固定到最大值(没有where条件的所有结果集的长度字符串) 我想做一些过滤器,结果是错误的,因为字符串不是8个字符,而是11个字符(8+3blank) where条件在子查询中完成,该字段中有一行8个字符,另一行11个字符(ftcc_ppp和ftcc_ppp_lx) 为什么报告服务会这样做?有什么解释吗 谢谢大家 编辑:查询代码: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个
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。对这种行为有何解释?