3

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

结尾

4

2 回答 2

2

我绝对不会把它写成随机的,当满足某些条件时,你不希望它突然出现。以下是一些我会尝试缩小范围的事情

1)您使用 LEFT JOIN,它可以在您希望为整数的字段(如 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”字段,因此它试图对一个不是数字的字段进行数学运算。这不太可能,但可能至少值得寻找。

但重要的是要弄清楚哪个字段产生了错误,这样你就可以把注意力集中在它上面。

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

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

于 2019-03-06T15:18:58.710 回答
0

只是把我的 2 美分放进去(知道这篇文章已经有 2 年的历史了),我并不是说这对每个人都有效。我遇到了与OP相同的问题。

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

于 2021-04-20T17:55:37.013 回答