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

ssrs error converting data type nvarchar to int

我将此存储过程传递给 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)

结束

我绝对不会把它作为随机注销,你不希望它在满足某些条件时弹出。这里有一些我会尝试缩小范围的事情

1) 您使用 LEFT JOIN,它可以在您希望为整数的字段中保留 NULL 值(如 QTY),尝试将它们包装在 SELECT 子句

中的 COALESCE 语句中
SELECT COALESCE(OpQty, 0) as OpQty, ...

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

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

3) SSRS 可能在 DETAIL 组的末尾添加了一个 "TOTAL" 字段,因此它会尝试对非数字字段进行数学计算。这不太可能,但可能所以至少值得寻找。

但重要的是找出哪个字段产生了错误,这样您就可以集中注意力。

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

请注意,这样做的缺点是,如果您更新存储过程定义以包含更多列,则必须记住跟踪并更新所有使用它的报表。如果您的设置不更改 SP 定义,那么这不是问题,并且是告诉 SSRS 正确类型是什么的最可靠方法,但对我来说,在长 运行 和在我遇到的每一种情况下,SSRS 都足够了。

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

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