2017-09-27 91 views
0

对于10分钟的时间,昨天一个SQL存储过程保持引发错误“字符串或二进制数据将被截断”时,它是通过我的网络服务器执行。但是,当我通过Microsost SQL Server Management Studio运行完全相同的SQL命令时,没有错误。无法重现“字符串或二进制数据将被截断”错误

在SP只有一个INSERT语句;这里是它的一个抽象:

DECLARE @TempTable table (Row1 varchar(25), Row2 varchar(4), Row3 int) 
INSERT INTO @TempTable (Row1,Row2,Row3) 
SELECT DISTINCT 
    A.Value 
    ,RIGHT(A.Text,4) 
    ,CAST(ISNULL(A.Thing,'0') as int) 
FROM ActivityTable A 

在数据库活动表,每那些行被定义为varchar(25)虽然事情总是用于整数(存储为varchar,是的,它是愚蠢的)。从表面上看,我看不出任何这些可能超过插入列的大小。

我想评论出来一个接一个,插入一个空字符串代替。首先,我用A.替换A.Value并刷新执行该过程的网页;没有错误。我认为这是问题列,所以我把它放回原始值,假设这会带来错误。除了它没有,并且从那以后错误没有再发生。

该SP已经没有问题,运行了几个月,不仅打破那些10分钟昨天。上周我将SQL服务器上的兼容级别从100提高到了130,所以我假设它必须以某种方式连接。但它似乎也受到我改变程序的影响,除了时间特定和用户特定。

+2

如果ActivityTable中的数据不断变化,过去10分钟无法重现问题是正常的。而不是对行进行注释,您可以从查询中选择所有字段的SELECT MAX(LEN()) – sepupic

+0

“抽象”在这里不太可能有帮助。你需要达到你能*重现你所遇到的实际错误的程度。我可以简单地坐下来编写产生这种错误的代码 - 但它不太可能会与实际的代码相似,因此当我指出如何修复* it *时,它不会很有帮助。 –

+1

如果所有字段的大小为25个字符,真是一个奇怪的问题。你是唯一管理该网络服务器的人吗?也许时间问题与同事改变某事有关,看到它使sp失败,并悄悄地恢复。 –

回答

0

1)在代码您声明表@TempTable和插入@temp

2)a.value中在一些情况下更长然后25chars。尝试使用LEFT(A.Value,25)代替。或者扩展列大小。

相关问题