У меня проблема с отчетом, который был написан до меня (предупреждаю, что в нем много кода, и ошибка не имеет смысла). По сути, это хранимая процедура, которая создает табличную переменную, а затем вставляет в нее несколько раз из разных мест. Две вставки получены из функций, остальные 3 - из только что написанного sql. Проблема в том, что первые два из них отлично работают вместе в SSMS, но в SSRS я продолжаю получать ошибку преобразования, и я знаю, что это от этих двух, остальные 3 не влияют на нее, включены они или нет. Вот часть процедуры только с двумя рассматриваемыми:
declare @QTable TABLE (
ChangeMadeTo Varchar(255) NULL,
EntryDate DateTime NULL,
Updatingagent Varchar(255) NULL,
ColumnName Varchar(255) NULL,
CompanyID Varchar(255) NULL,
CompanyName Varchar(255) NULL,
LastNumberCalled Varchar(15) NULL,
CallNotes Varchar (4000) NULL,
OldValue Varchar(255) NULL,
NewValue Varchar(255) NULL)
insert into @QTable (
ChangeMadeTo, EntryDate, Updatingagent, ColumnName, CompanyID, CompanyName, LastNumberCalled, CallNotes, OldValue, NewValue
)
SELECT
'Questionnaire'
, Q.DateTimeStamp
, Agentforename + ' ' + AgentSurname + ' ('+ UserID + ')'
, QuestionText
, cm.companyid
, companyname
, cn.PhoneNumber
, CAST(ISNULL(NULLIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CallNotes, '|', ''), '"', ''), char(9), ' '), char(10), ' '), char(13), ' '), ''), '') AS VARCHAR(4000)) AS CallNotes
, 'N/A'
, Q.Answer
from dbo.gfn_Questionniare_MC_And_FreeText() as Q
join callcentre_web.dbo.Agents as A
on A.AgentID = Q.AgentID
join campaignmapping as cm
on cm.companyid = Q.Company_ID
and cm.campaignid = Q.campaignid
join company as C
on c.companyid = cm.companyid
join Calldetails as CD
on cd.mapid = cm.mapid
left join contactnumbers as cn
on cn.contactnumberid = cd.contactnumberid
Where Q.CampaignID = @CampaignID
and Q.DateTimeStamp between @fromdate and @todate
insert into @QTable (
ChangeMadeTo, EntryDate, Updatingagent, ColumnName, CompanyID, CompanyName, LastNumberCalled, CallNotes, OldValue, NewValue
)
SELECT
'Questionnaire'
, Q.DateTimeStamp
, Agentforename + ' ' + AgentSurname + ' ('+ UserID + ')'
, QuestionText
, cm.companyid
, companyname
, cn.PhoneNumber
, CAST(ISNULL(NULLIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CallNotes, '|', ''), '"', ''), char(9), ' '), char(10), ' '), char(13), ' '), ''), '') AS VARCHAR(4000)) AS CallNotes
, 'N/A'
, Q.Answer
from dbo.gfn_Questionniare_Multiple_Selections() as Q
join callcentre_web.dbo.Agents as A
on A.AgentID = Q.AgentID
join campaignmapping as cm
on cm.companyid = Q.Company_ID
and cm.campaignid = Q.campaignid
join company as C
on c.companyid = cm.companyid
join Calldetails as CD
on cd.mapid = cm.mapid
left join contactnumbers as cn
on cn.contactnumberid = cd.contactnumberid
Where Q.CampaignID = @CampaignID
and Q.DateTimeStamp between @fromdate and @todate
И это две функции, из которых считывается приведенный выше запрос:
SELECT
cm.campaignid
, campaign
, cm.CompanyID as Company_ID
, QuestionText
, DateTimeStamp
, AgentID
, CAST(STUFF((select ',' + CAST(ISNULL(NULLIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(e.Answer, '|', ''), '"', ''), char(9), ' '), char(10), ' '), char(13), ' '), ''), '') AS VARCHAR(4000))
FROM Questionnaire a
cross apply dbo.SplitString(a.Answer,',') b
join CallCentre_Web.dbo.Questionnaire_Answers e
on b.s = e.AnswerID
where isnumeric(b.s) = 1
and QuestionTypeID = 2
and a.QuestionnaireID = q.QuestionnaireID
for xml path('')),1,1,'') AS VARCHAR(255)) as Answer
FROM Questionnaire AS q
JOIN dbo.ProfileMapping AS PM
ON PM.ProfileMappingID = Q.ProfileMappingID
JOIN CampaignMapping AS CM
ON PM.MapID = CM.MapID
join callcentre_web.dbo.LK_ProfileType as PT
on PT.ProfileTypeID = PM.ProfileTypeID
JOIN CallCentre_Web.dbo.Questionnaire_Questions QQ
ON Q.QuestionID = QQ.QuestionID
join callcentre_web.dbo.lk_Campaigns as LKC
on LKC.CampaignID = cm.CampaignID
WHERE QuestionTypeID = 2
и
SELECT
cm.campaignid
, Campaign
, CompanyID as Company_ID
,QuestionText
,CAST(ISNULL(NULLIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Q.Answer, '|', ''), '"', ''), char(9), ' '), char(10), ' '), char(13), ' '), ''), '') AS VARCHAR(4000)) as Answer
, DateTimeStamp
, AgentID
FROM Questionnaire AS Q
JOIN CallCentre_Web.dbo.Questionnaire_Questions QQ
ON Q.QuestionID = QQ.QuestionID
JOIN dbo.ProfileMapping AS PM
ON PM.ProfileMappingID = Q.ProfileMappingID
join callcentre_web.dbo.LK_ProfileType as PT
on PT.ProfileTypeID = PM.ProfileTypeID
JOIN CampaignMapping AS CM
ON PM.MapID = CM.MapID
join callcentre_web.dbo.lk_Campaigns as LKC
on LKC.CampaignID = cm.CampaignID
WHERE QuestionTypeID = 0
union all
SELECT
cm.campaignid
, Campaign
, CompanyID
, QuestionText
, CAST(ISNULL(NULLIF(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(QA.Answer, '|', ''), '"', ''), char(9), ' '), char(10), ' '), char(13), ' '), ''), '') AS VARCHAR(4000)) AS Answer
, DateTimeStamp, AgentID
FROM Questionnaire AS Q
JOIN CallCentre_Web.dbo.Questionnaire_Questions QQ
ON Q.QuestionID = QQ.QuestionID
JOIN CallCentre_Web.dbo.Questionnaire_Answers QA
ON Q.Answer = QA.AnswerID
JOIN dbo.ProfileMapping AS PM
ON PM.ProfileMappingID = Q.ProfileMappingID
join callcentre_web.dbo.LK_ProfileType as PT
on PT.ProfileTypeID = PM.ProfileTypeID
JOIN CampaignMapping AS CM
ON PM.MapID = CM.MapID
join callcentre_web.dbo.lk_Campaigns as LKC
on LKC.CampaignID = cm.CampaignID
WHERE QuestionTypeID = 1
)
Обе эти функции работают нормально независимо, и обе работают нормально как часть первого запроса, однако, когда я пытаюсь запустить ее в ssrs, я получаю: Произошла ошибка во время процесса локального отчета. Произошла ошибка во время процесса отчета. Ошибка выполнения запроса для набора данных 'gsp_rpt_InfoCaptured' Ошибка преобразования при преобразовании значения varchar '14 -06-2015 14:21:18 'в тип данных smallint.
Однако преобразований нет. У меня были аналогичные проблемы в прошлом, и мне, как ни странно, удалось их обойти, перемещая часть, которая запрашивает анкету, по запросу, но на этот раз я не могу этого сделать.
Я надеюсь, что кто-нибудь сможет пролить свет на это для меня. У меня такое чувство, что это как-то связано с частями запроса, которые выполняются до того, как другие успевают завершить. Я пробовал использовать объединения, табличную переменную и CTE, но в какой-то момент всегда сталкивался с ошибкой. Однако я не могу использовать GO, поскольку мне нужны переменные для отчета (выбор кампании и даты и времени)
Заранее благодарю за любую помощь.
У меня была аналогичная проблема с появлением ошибок преобразования, когда моя сохраненная процедура выполнялась через SSRS, но не в SSMS.
Ошибки исчезли, когда я убедился, что сохраненная процедура не выдает никаких предупреждений. например
Предупреждение: нулевое значение удаляется агрегированием или другой операцией SET.
Не уверен, поможет ли это, но попробовать стоит.