Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转换varchar值“4K0400”时转换失败_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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