字符串或二进制数据将被截断(存储过程)

时间:2016-08-31 08:48:13

标签: sql-server tsql stored-procedures

运行我的存储过程时出现此错误。此过程适用于某些输入。 我在下面的代码中设置了一天: 2016/08/24 00:00:00 在这种情况下获取错误,但如果我更改为 2016/08/25 00:00:00 当前工作。在我的存储过程中,我调用表基函数并从中获取数据.I增加过程和函数的输入长度但不起作用。在Error中打印它的变量的变量类型是{{ 1}}这在函数和存储过程中是一样的。如果代码是对的?应适用于任何输入。

DateCall nvarchar(128)
  

Msg 8152,Level 16,State 13,Procedure ProcGetReportTRAINPDF,第92行   字符串或二进制数据将被截断。声明一直如此   终止。

SP:

EXEC    @return_value = [dbo].[ProcGetReportTRAINPDF]
        @StartDate = N'2016/08/24 00:00:00',
        @endDate = N'2016/08/31 23:59:59',
        @top = 50

功能:

ALTER PROCEDURE [dbo].[ProcGetReportTRAINPDF](@StartDate  nvarchar(128),@endDate  nvarchar(128) , @top int)
AS 
BEGIN 
DECLARE @GetTrainRep TABLE
     (
          RajaID nchar(50)
           ,fk_serial nvarchar(50)
           ,CircularPeriod nvarchar(50)
           ,TrainNumber nvarchar(50)
           ,MoveDate nvarchar(50)
           ,WagonType nvarchar(50)
           ,WagonTypeName nvarchar(50)
           ,Degree nvarchar(50)
           ,WagonNumber nvarchar(50)
           ,CompartmentNumber nvarchar(50)
           ,SeatNumber nvarchar(50)
           ,RationCode nvarchar(50)
           ,RattionName nvarchar(50)
           ,SexCode nvarchar(50)
           ,StartStation nvarchar(50)
           ,startstationName nvarchar(50)
           ,EndStation nvarchar(50)
           ,EndStationName nvarchar(50)
           ,TicketSeries nvarchar(50)
           ,TicketNumber nvarchar(50)
           ,Movetime nvarchar(50)
           ,Name nvarchar(50)
           ,Family nvarchar(50)
           ,NationalCode nvarchar(50)
           ,Fk_sellerCode nvarchar(50)
           ,Fk_SaleCenterCode nvarchar(50)
           ,saleCenterName nvarchar(50)
           ,Telephone nvarchar(50)
           ,Register nvarchar(50)
           ,fk_TicketType nvarchar(50)
           ,fk_Tariff nvarchar(50)
           ,TariffName nvarchar(50)
           ,Formula1 nvarchar(50)
           ,Formula2 nvarchar(50)
           ,Formula3 nvarchar(50)
           ,Formula4 nvarchar(50)
           ,Formula5 nvarchar(50)
           ,Formula6 nvarchar(50)
           ,Formula7 nvarchar(50)
           ,Formula8 nvarchar(50)
           ,Formula9 nvarchar(50)
           ,Formula20 nvarchar(50)
           ,Formula19 nvarchar(50)
           ,Formula18 nvarchar(50)
           ,Formula17 nvarchar(50)
           ,Formula16 nvarchar(50)
           ,Formula15 nvarchar(50)
           ,Formula14 nvarchar(50)
           ,Formula13 nvarchar(50)
           ,Formula12 nvarchar(50)
           ,Formula11 nvarchar(50)
           ,FullPrice nvarchar(50)
           ,HalfPrice nvarchar(50)
           ,AxleCode nvarchar(50)
           ,PathCode nvarchar(50)
           ,OrderNumber nvarchar(50)
           ,Formula10 nvarchar(50)
           ,SaleId nvarchar(50)
           ,ServicesCode nvarchar(50)
           ,ServicesNo nvarchar(50)
           ,ServiesAmount nvarchar(50)
           ,TotalServices nvarchar(50)
           ,Amount nvarchar(50)
           ,ReduplicateID nvarchar(50)
           ,R2 nvarchar(50)
           ,[Status] nvarchar(50)
           ,PersonCode nvarchar(50)
           ,ReuplicateTicketNumber nvarchar(50)
           ,ReuplicateTicketSeries nvarchar(50)
           ,IsPrintAble nvarchar(50)
           ,TrainMessage nvarchar(50)
           ,CompanyName nvarchar(50)
           ,Isprinted nvarchar(50)
           ,statusName nvarchar(50)
           ,BarcodeImage image
           ,SecurityNumber nvarchar(50)
           ,servicetypename nvarchar(50)
           ,TimeOfArrival nvarchar(50)
           ,UserName nvarchar(50)
           ,DateCall nvarchar(128)
           ,DeparturId int
           ,ReserveDate nvarchar(50)
           ,IsDepartur bit
   )
INSERT INTO @GetTrainRep 
SELECT * from dbo.[FunGetReportTRAINPDF](@StartDate ,@endDate , @top  )
SELECT * FROM @GetTrainRep
END

enter image description here [enter image description here] [enter image description here] 3 enter image description here

1 个答案:

答案 0 :(得分:1)

导致错误消息的原因是TrainMessage列,在原始表中定义为NVARCHAR(800),而在您的函数和proc中,它被截断为NVARCHAR(50)。您要么匹配大小,要么通过SUBSTRING()LEFT()或函数/ proc中的其他内容故意截断它。

我仍然建议考虑评论中建议的人。使用字符串存储DateTime类型是一个很大的红旗,最终可能会让你感到困惑。我宁愿把它们转移到正确的类型上。