Ошибка ssrs при преобразовании типа данных nvarchar в int - PullRequest
2 голосов
/ 06 марта 2019

Я передал эту хранимую процедуру в 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)

end

1 Ответ

1 голос
/ 06 марта 2019

Я бы определенно не списывал это как случайный случай, вы не хотите, чтобы это появлялось снова при соблюдении определенных условий. Вот несколько вещей, которые я бы попытался сузить

1) Вы используете LEFT JOINs, он может оставить значения NULL в полях, которые, как вы ожидаете, будут целыми числами (например, QTY), попробуйте заключить их в операторы COALESCE в предложении SELECT

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

2) SSRS может угадывать тип данных неправильно, оно может считать поле символа целым числом, если первые несколько значений являются числами. Выясните, какое поле генерирует ошибку, и, возможно, приведите ее явно к NVARCHAR, чтобы SSRS не пытался использовать ее как целое число

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

3) SSRS, возможно, добавил поле «ВСЕГО» в конце группы DETAIL, поэтому он пытается выполнить математику для поля, которое не является числом. Это менее вероятно, но возможно, поэтому, по крайней мере, стоит искать.

Но важно выяснить, КАКОЕ поле генерирует ошибку, чтобы вы могли сосредоточить на ней свое внимание.

РЕДАКТИРОВАТЬ: Если вы используете SQL Server 2012 или более поздней версии, вы также можете явно установить типы данных, возвращаемых с помощью предложения EXECUTE WITH RESULT SETS в вашем наборе данных в отчете. Хороший пример: http://www.sqlservercentral.com/blogs/sqlstudies/2016/01/14/what-is-result-sets/

Обратите внимание, что это имеет тот недостаток, что если вы обновите определение хранимой процедуры, добавив в него больше столбцов, вы должны будете не забывать отслеживать и обновлять все отчеты, которые ее используют. Если ваши настройки не меняют определения SP, это не проблема, и это самый надежный способ сообщить SSRS, какие типы являются правильными, но для меня приведение типа в SP более гибко в долгосрочной перспективе и достаточно для SSRS. в каждом случае, с которым я столкнулся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...