Sql 转换varchar值“4K0400”时转换失败
下面的存储过程给出了上述错误。然而,当我将每个部分作为一个简单的查询运行时,它工作得很好。我没有看见什么?它应该得到部门不同班次的数据Sql 转换varchar值“4K0400”时转换失败,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,下面的存储过程给出了上述错误。然而,当我将每个部分作为一个简单的查询运行时,它工作得很好。我没有看见什么?它应该得到部门不同班次的数据 ALTER PROCEDURE [dbo].[DataByDepartment] ( @referenceDateTime DATETIME ,@shiftsBackward INT ,@shiftsForward INT ,@departmentID int )AS BEGIN SET TRANSACTION ISOLATION LEVEL READ U
ALTER PROCEDURE [dbo].[DataByDepartment]
(
@referenceDateTime DATETIME
,@shiftsBackward INT
,@shiftsForward INT
,@departmentID int
)AS BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
DECLARE @referenceStartDate DATETIME;
DECLARE @referenceEndDate DATETIME;
SET @referenceDateTime=COALESCE(@referenceDateTime,CURRENT_TIMESTAMP);
SET @shiftsBackward=COALESCE(@shiftsBackward,2);
SET @shiftsForward=COALESCE(@shiftsForward,1);
SELECT
@referenceStartDate=MIN(StartDateTime)
,@referenceEndDate=MAX(EndDateTime)
FROM dbo.GetShiftsDateTime(@referenceDateTime,@shiftsBackward,@shiftsForward,2);
WITH DataByStockCode AS
(
SELECT D.StockCode
,D.EntryDate+CAST(STUFF(STUFF(STUFF(RIGHT('00000000'+CAST(D.TrnTime AS VARCHAR(10)),8),3,0,':'),6,0,':'),9,0,':') AS TIME) AS DateTime
,IM.TrnQty AS Qty
,FD.AlphaValue
FROM [dbo].[Data] AS D
INNER JOIN [dbo].[FormData] as FD on
D.StockCode=FD.KeyField
WHERE (
(D.TrnYear>=(YEAR(CURRENT_TIMESTAMP)-1))
AND
(D.TrnMonth>=1)
AND
(D.EntryDate>=CAST(@referenceStartDate AS DATE))
AND
(D.EntryDate<=CAST(@referenceEndDate AS DATE))
AND
FD.AlphaValue=@departmentID
)
)
,ByShift AS
(
SELECT
GWSFRDT.ShiftSequence
,BSC.DateTime
,BSC.StockCode
,BSC.Qty
,BSC.AlphaValue
,GWSFRDT.StartDateTime AS ShiftStart
,GWSFRDT.EndDateTime AS ShiftEnd
,GWSFRDT.ShiftPatternName
FROM DataByStockCode AS BSC
INNER JOIN dbo.GetShiftsDateTime(@referenceDateTime,@shiftsBackward,@shiftsForward,2) AS GWSFRDT
ON(
(BSC.DateTime>=GWSFRDT.StartDateTime)
AND
(BSC.DateTime<=GWSFRDT.EndDateTime)
)
)
SELECT
BBS.ShiftSequence
,BBS.DateTime
,BBS.AlphaValue
,sum(BBS.Qty) as TotalQTY
,BBS.ShiftStart
,BBS.ShiftEnd
,BBS.ShiftPatternName
Group BY ShiftSequence,DateTime,AlphaValue,Qty,ShiftStart
,ShiftEnd
,ShiftPatternName
END
我认为错误来自这一行:
D.EntryDate+CAST(STUFF(STUFF(STUFF(RIGHT('00000000'+CAST(D.TrnTime AS VARCHAR(10)),8),3,0,':'),6,0,':'),9,0,':') AS TIME) AS DateTime
我假设EntryDate是一个日期时间。加号被解释为带有日期时间的加法,因此+后面的表达式隐式转换为int,因为您不能将时间值添加到日期时间值。
试一试
为了证实这一点
假设TrnTime是一个时间字段,只需将其转换为datetime:
D.EntryDate+CAST(D.TrnTime AS DATETIME) AS DateTime
它会很好地工作。您能否包含完整的错误输出,以便我们至少有机会确定问题在存储过程中的何处?我认为错误在于语句:CASTD.TrnTime AS VARCHAR10。但在发布完整的错误消息之前,无法确切说明具体内容。将varchar值“4K0400”转换为数据类型int时,Msg 245,级别16,状态1,第1行转换失败。这是完整的错误,因为4K0400不能是int,你已经知道了错误的原因。我知道,但是我没有看到我正在将varchar转换为int。只看到Allen S.Hansen的评论和你的回复。我认为他是对的。关于作为查询执行和作为存储过程执行之间的区别:存储过程可能使用不同的执行计划,这将遇到“04k0400”值。对于测试,我使用创建表选项卡AlphaValue varchar50插入到选项卡值5中,“04k040”失败。但是,插入制表符值5插入制表符值“04k040”有效。试试FD.AlphaValue=CAST@departmentID作为varchar来避免这种情况。
D.EntryDate+CAST(D.TrnTime AS DATETIME) AS DateTime