Stored procedures 存储过程失败,为“0”;将varchar转换为数据类型numeric时出现算术溢出错误。”;错误,即使我显式强制转换了所有字段
我花了大量的时间让这个存储过程正常工作,它基本上是将查询结果转换成html格式,然后通过电子邮件发送。proc从中收集数据的查询工作正常,并按预期返回结果,但是当尝试将输出放入电子邮件的表中时,它会失败,并出现算术溢出错误Stored procedures 存储过程失败,为“0”;将varchar转换为数据类型numeric时出现算术溢出错误。”;错误,即使我显式强制转换了所有字段,stored-procedures,sql-server-2008-r2,arithmetic-overflow,Stored Procedures,Sql Server 2008 R2,Arithmetic Overflow,我花了大量的时间让这个存储过程正常工作,它基本上是将查询结果转换成html格式,然后通过电子邮件发送。proc从中收集数据的查询工作正常,并按预期返回结果,但是当尝试将输出放入电子邮件的表中时,它会失败,并出现算术溢出错误 DECLARE @sCompanyName varchar(50) = 'ITT Discrepancy' DECLARE @sEmailTo varchar(128) = '' DECLARE @sMailProfile varchar(128)
DECLARE @sCompanyName varchar(50) = 'ITT Discrepancy'
DECLARE @sEmailTo varchar(128) = ''
DECLARE @sMailProfile varchar(128) = 'Database Notification Profile'
-- Other declarations
DECLARE @sEMailSubject varchar(100) = @sCompanyName + convert(varchar(10),Convert(date,getdate()))
DECLARE @sMessageBody varchar(max) = '', @sITT varchar(max) = '', @iMailItemID int = 0
-- Exit if there are no records to process
IF NOT EXISTS(select ORDDOCID, ITEMNMBR, TRNSFQTY, case when ct is null then 0 else ct end as 'SerialsScanned', TRNSFQTY-ct as 'Diff' from
(select ORDDOCID, ITEMNMBR,TRNSFQTY from ZTEST.dbo.SVC00701 where TRNSFLOC = 'TS-PF' and STATUS in (3,4)) as gp
left join
(select OrderNumber, ItemNumber, COUNT(serial) as 'ct' from ManualScan.dbo.SoldItems where TranType = 'ITT' group by OrderNumber, ItemNumber) as srl on gp.ORDDOCID = srl.OrderNumber and gp.ITEMNMBR = srl.ItemNumber
where TRNSFQTY-(case when ct is null then 0 else ct end)>0)
RETURN
-- Set the header
SET @sMessageBody = '<html><head><style type="text/css">
.style1
{
width: 100%;
border-style: solid;
border-width: 1px;
}
</style>
</head>
<p style="font-size: large; color: #CC3300;">
' + @sCompanyName + '
</p>'
-- Set the Items Received
DECLARE @sITTnum varchar(31), @sItemNum varchar(31), @sITTQty numeric(19,5), @sSrlQty numeric(18,0), @sDiff numeric(18,0)
DECLARE cITT CURSOR FOR
select ORDDOCID, ITEMNMBR, cast(TRNSFQTY as numeric(18,0)), cast(case when ct is null then 0 else ct end as numeric(18,0)) as 'SerialsScanned', cast(TRNSFQTY as numeric(18,0))-cast(case when ct is null then 0 else ct end as numeric(18,0)) as 'Diff'
from
(select ORDDOCID, ITEMNMBR,cast(TRNSFQTY as numeric(18,0)) as 'TRNSFQTY' from ZTEST.dbo.SVC00701 where TRNSFLOC = 'TS-PF' and STATUS in (3,4)) as gp
left join
(select OrderNumber, ItemNumber, cast(case when COUNT(serial) is null then 0 else COUNT(serial) end as numeric(18,0)) as 'ct' from ManualScan.dbo.SoldItems where TranType = 'ITT' group by OrderNumber, ItemNumber) as srl on gp.ORDDOCID = srl.OrderNumber and gp.ITEMNMBR = srl.ItemNumber
where TRNSFQTY-(case when ct is null then 0 else ct end)>0
OPEN cITT
FETCH NEXT FROM cITT INTO @sITTnum, @sItemNum, @sITTQty, @sSrlQty, @sDiff
WHILE @@FETCH_STATUS = 0
BEGIN
`it says error occurs at this line...`
SELECT @sITT = @sITT + '<tr><td style="border-style: solid; border-width: thin">' + @sITTnum +
'</td><td style="border-style: solid; border-width: thin">' + @sItemNum +
`but if I comment out from these lines it works fine so something in these values/variables`
'</td><td style="border-style: solid; border-width: thin">' + @sITTQty +
'</td><td style="border-style: solid; border-width: thin">' + @sSrlQty +
'</td><td style="border-style: solid; border-width: thin">' + @sDiff +
'</td></tr>'
FETCH NEXT FROM cITT INTO @sITTnum, @sItemNum, @sITTQty, @sSrlQty, @sDiff
END
CLOSE cITT
DEALLOCATE cITT
IF @sITT <> ''
SET @sITT = '<table class="style2"
style="font-family: "Times New Roman", Times, serif; border-style: solid; border-width:thin">
<tr>
<td style="border-style: solid; border-width: thin" >
<b>ITT Num</b></td>
<td style="border-style: solid; border-width: thin" >
<b>Item Number</b></td>
<td style="border-style: solid; border-width: thin">
<b>ITT Quantity</b></td>
<td style="border-style: solid; border-width: thin">
<b>Scanned Quantity</b></td>
<td style="border-style: solid; border-width: thin">
<b>Difference</b></td>
</tr>' + @sITT + '</table></body></html>'
SET @sMessageBody = @sMessageBody + @sITT
EXEC msdb..sp_send_dbmail
@profile_name = @sMailProfile,
@body_format = 'HTML',
@recipients = @sEmailTo,
@subject = @sEMailSubject,
@body = @sMessageBody,
@mailitem_id = @iMailItemID OUTPUT
任何指导都将不胜感激。在失败的一行中,您基本上有:
declare @sITTQty numeric(19,5); -- = ...
declare @sITT varchar(max); -- = ...
set @sITT = @sITT
+ '</td><td style="border-style: solid; border-width: thin">'
+ @sITTQty
-- + ...
编辑:您必须对@sDiff
和@sSrlQty
declare @sITTQty numeric(19,5);
declare @sITT varchar(max);
set @sITT = @sITT
+ '</td><td style="border-style: solid; border-width: thin">'
+ cast(@sITTQty as varchar(19))
-- + ...
declare @sITTQty numeric(19,5);
declare @sITT varchar(max);
set @sITT = @sITT
+ '</td><td style="border-style: solid; border-width: thin">'
+ cast(@sITTQty as varchar(19))
-- + ...