ssrs将数据类型nvarchar转换为int时出错

时间:2019-03-06 13:22:57

标签: sql sql-server stored-procedures ssrs-2017

我将此存储过程传递到ssrs中以生成报告,但是在将数据类型nvarchar转换为int时却不断出错,而我什至没有任何nvarchar类型的参数。

Alter proc dbo.spPullOrderRosa1
@Subentity int,
@BegShipDate date,
@EndShipDate date,
@Store varchar(150),
@State varchar(150)
as
begin

select OpOrID as OrID, OpID, concat(OrCuFirstName,' ',OrCuLastName) as CustomerName,
b.SoName as StoreName,OpPrSKU as SKU, OpQty,StLongName as StateName,
cast(OpShipDate as date) as ShipDate, 
cast(d.DeliveryDate as date) as DeliveryDate,
e.StyName as SubEntity

from csn_order..tblOrderProduct a with (nolock)
left join csn_order..tblOrder f with (nolock) on a.OpOrID = f.OrID
left join csn_order..tblStore b with (nolock) on a.OpSoID = b.SoID
left join csn_order..tblplState c with (nolock) on f.OrCuStID = c.StID
left join csn_order..tblDeliveryDate d with (nolock) on a.OpID = d.DeliveryOpID
left join csn_order.dbo.tblSubEntity e with (nolock) on b.SoStyID = e.StyID
where (OpCancelled = 0) and (b.SoID in (select SoID from csn_order..tblStore where SoName in (select * from STRING_SPLIT(@Store, ','))  )) 
and (StID in (select StID from csn_order..tblplState where StLongName in (select * from STRING_SPLIT(@State, ',')) )) 
and (StyID =  @Subentity) and (OpShipDate >= @BegShipDate and OpShipDate <= @EndShipDate)

结束

2 个答案:

答案 0 :(得分:1)

我绝对不会把它写成随机的,您不希望在满足某些条件时再次出现这种情况。这是我尝试缩小范围的几件事

1)您使用LEFT JOINs,它可以在期望为整数的字段(如QTY)中保留NULL值,请尝试将其包装在SELECT子句的COALESCE语句中

SELECT COALESCE(OpQty, 0) as OpQty, ...

2)SSRS可能猜测数据类型错误,如果前几个值是数字,则它可能认为字符字段是整数。找出产生错误的字段,并可能将其显式转换为NVARCHAR,这样SSRS不会尝试将其用作整数

SELECT CONVERT(nvarchar(50), OpPrSKU) as SKU, ...

3)SSRS可能在DETAIL组的末尾添加了一个“ TOTAL”字段,因此它试图对非数字字段进行数学运算。这可能性较小,但至少值得寻找。

但是重要的是要弄清楚WHICH字段正在产生错误,因此您可以将注意力集中在此上。

编辑:如果您使用的是SQL Server 2012或更高版本,则还可以在报表的数据集中使用EXECUTE WITH RESULT SETS子句显式设置返回的数据类型。一个很好的例子是http://www.sqlservercentral.com/blogs/sqlstudies/2016/01/14/what-is-result-sets/

请注意,这样做的缺点是,如果您更新存储过程定义以包括更多列,则必须记住要跟踪并更新所有使用它的报告。如果您的设置不会更改SP定义,那么这不是问题,并且是告诉SSRS什么是正确类型的最可靠方法,但是对我来说,从长远来看,在SP中强制转换类型对于SSRS而言已足够灵活在每种情况下我都遇到过。

答案 1 :(得分:0)

只是为了投入我的 2 美分(知道这篇文章已经超过 2 年了),我并不是说这对每个人都有效。我遇到了与 OP 相同的问题。

我创建了一个新的 rdl 文件并复制了所有对象。