“字符串或二进制数据将被截断”错误

时间:2015-01-22 18:50:18

标签: sql sql-server

我有一个有趣的问题,就在几周前,我的SQL服务器出现了。我使用Crystal Reports来执行我的数据库的常规查询,我的一个报告最近开始有时失败,并且在其他时间成功。首先让我说我不是一个真正的DBA,我只是从其他人那里接管这个数据库和Crystal Reports设置。我没有写有问题的查询。

我已经做了一些挖掘,我似乎找到了导致问题的语法。这是一个相当长的查询,所以我不会包含所有内容,除非有要求。此查询根据今天的日期提取数据。有时候,查询会成功,有些日子会失败。失败时,错误代码为:

String or binary data would be truncated.

以下是导致此问题的语法:

DECLARE @LastWeekDay AS DATETIME

SET @LastWeekDay = 
(SELECT
CASE
   WHEN DATEPART ( weekday, GETDATE() ) = 2 THEN
      CAST ( DATEADD ( day, -3, GETDATE() ) AS DATE )
   WHEN DATEPART ( weekday, GETDATE() ) = 1 THEN
      CAST ( DATEADD ( day, -2, GETDATE() ) AS DATE )
   ELSE
      CAST ( DATEADD ( day, -1, GETDATE() ) AS DATE )
END)

如果我开始操作此查询,则输入静态日期,而不是使用GETDATE()函数。结果喜忧参半。今天,该报告正在发挥作用,所以如果我今天投入这样的日期,它会起作用,并给我我想要的结果:

DECLARE @LastWeekDay AS DATETIME

SET @LastWeekDay = 
(SELECT
CASE
   WHEN DATEPART ( weekday, '1/22/2015' ) = 2 THEN
      CAST ( DATEADD ( day, -3, '1/22/2015' ) AS DATE )
   WHEN DATEPART ( weekday, '1/22/2015' ) = 1 THEN
      CAST ( DATEADD ( day, -2, '1/22/2015' ) AS DATE )
   ELSE
      CAST ( DATEADD ( day, -1, '1/22/2015' ) AS DATE )
END)

但是,如果我将日期更改为2015年1月21日,则会失败并显示以下错误代码:

(1 row(s) affected)
Msg 8152, Level 16, State 14, Line 310
String or binary data would be truncated.
The statement has been terminated.

我走到310号线,看看问题是什么。这是310的代码。

308 DECLARE @Queue TABLE ( LoanID varchar(8), LoanType varchar(12), CreditApproval DATE )
309 
310 INSERT INTO @Queue ( LoanID, LoanType, CreditApproval )
311 SELECT
312 "_364" LoanID,
313 "_1172" LoanType,
314 "_2300" CreditApproval

我已尝试增加字段声明的字符数,但这似乎不起作用。我无法弄清楚为什么某些日期会产生结果,有些日子会产生错误。

以下是过去几周的示例,以及有效/产生错误的日​​期:

1/22   Works
1/21   Error
1/20   Works
1/19   Works
1/16   Error
1/15   Error
1/14   Works
1/13   Works
1/12   Error
1/9    Works
1/8    Works
1/7    Error

所有日期1/6和之前似乎工作得很好。可能导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。在某些时候,我的一个字段的长度在SQL中从VARCHAR(12)更改为VARCHAR(25)。有些日子,查询的值少于12个字符,所以没有问题。其他日期,该值超过12,并在您尝试将其插入“贷款类型”字段时导致错误。我只是将声明中字段的长度更改为25个字符。现在我没有更多问题了。这是我的新声明。

DECLARE @Queue TABLE ( LoanID varchar(8), LoanType varchar(25), CreditApproval DATE )

INSERT INTO @Queue ( LoanID, LoanType, CreditApproval )
SELECT
"_364" LoanID,
"_1172" LoanType,
"_2300" CreditApproval

FROM
(((emdbuser.LOANXDB_S_02 s2
INNER JOIN emdbuser.LOANXDB_S_06 s6 ON s2.XrefId = s6.XrefId )
INNER JOIN emdbuser.LOANXDB_S_01 s1 ON s2.XrefId = s1.XrefId )
INNER JOIN emdbuser.LOANXDB_S_03 s3 ON s2.XrefId = s3.XrefId )
INNER JOIN emdbuser.LOANXDB_D_02 d2 ON s2.XrefID = d2.XrefId 

在我的查询中还有一个声明,我必须将字段长度更改为25.现在一切都很好。