#sql #sql-server #stored-procedures #ssrs-2017
#sql #sql-сервер #хранимые процедуры #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)
завершение
Комментарии:
1. К какому типу относятся все ваши поля ID (используемые в объединениях) и OpCancelled? Любое сравнение значений int и nvarchar может привести к такой ошибке.
2. Доступны ли какие-либо из ваших параметров SSRS с множественным выбором? например, если @Subentity является множественным выбором, то идентификаторы будут передаваться в виде разделенной запятыми строки varchar (максимум). Например. «12, 34, 16»
3. Нормально ли работает SP из Management Studio, и ошибка возникает только в SSRS?
4. Состояние и хранилище выбираются несколькими способами, но я использовал string_split для них
5. это работало в sql, но не в SSRS
Ответ №1:
Я определенно не стал бы списывать это на случайность, вы же не хотите, чтобы это снова появлялось при выполнении определенных условий. Вот несколько вещей, которые я бы попытался сузить
1) При использовании ЛЕВЫХ соединений могут оставаться нулевые значения в полях, которые, как вы ожидаете, будут целыми числами (например, QTY), попробуйте обернуть их в операторы COALESCE в вашем предложении SELECT
SELECT COALESCE(OpQty, 0) as OpQty, ...
2) SSRS, возможно, неправильно определяет тип данных, он может подумать, что символьное поле является целым числом, если первые несколько значений являются числами. Выясните, какое поле генерирует ошибку, и, возможно, явно передайте его в NVARCHAR, чтобы SSRS не пытались использовать его как целое число
SELECT CONVERT(nvarchar(50), OpPrSKU) as SKU, ...
3) SSRS, возможно, добавила поле «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 в каждом случае, с которым я столкнулся.
Комментарии:
1. Спасибо за советы. Я не думаю, что что-то не так с хранимой процедурой — потому что, если это так, я не смог бы запустить ее в SSRS только с другим файлом rdl. Я создал два файла rdl для запуска sp, и я полагаю, что они одинаковы, по крайней мере, в SSRS (не на уровне кода), и один работал, а другой нет. если это вторая или третья причина, то они обе должны работать.
2. В настоящее время я сравниваю два файла rdl в notepad и пытаюсь выяснить, есть ли какая-либо разница в настройках по умолчанию между ними.
3. Я согласен, что это не проблема в хранимой процедуре, я думаю, проблема в том, что SSRS неправильно угадывает тип данных, я предлагаю изменить хранимую процедуру, чтобы «обмануть» SSRS и заставить угадать правильный тип для всех данных.
4. но в таком случае, почему два одинаковых файла rdl выдали бы разный результат?
5. Я выяснил, почему. В наборе данных, который передает sp, значение параметра не заключено в квадратные скобки. в итоге он отображался как @subrntity вместо параметра!@subrntity.value в html-коде. После того, как я изменил это, мой файл rdl заработал!
Ответ №2:
Просто чтобы добавить свои 2 цента (зная, что этому сообщению уже более 2 лет), и я не говорю, что это сработает для всех. Я столкнулся с той же проблемой, что и OP.
Я создал новый файл rdl и скопировал все объекты.