1

我在 MS SQL 2008 中有一个存储过程,它编译时没有错误,但是当执行存储过程时,我收到错误消息“字符串或二进制数据将被截断”。不幸的是,我无法追踪发生这种情况的地方。

当我开发我的存储过程时,我首先测试了查询,并且它有效。

所以,如果有人能告诉我发生这种情况的地点和原因以及如何解决它,我将不胜感激:

ALTER PROCEDURE [dbo].[sp_Material_Validation]

@ValidType varchar(MAX),
@MaterialID varchar(MAX)
AS
BEGIN


DECLARE
@MessageReturn varchar(100);
SET @MessageReturn = NULL;

IF @ValidType = 'Primary'

Select TOP 1 Valid.StatusMessage
From
(Select MatID,'Property Not Completed' as StatusMessage
From dbo.Properties
WHERE DATALENGTH(ValueString)=0
UNION
Select PrpCount.MatID,'There not all Properties exist' as StatusMessage
From (Select Count(unkey) as unKeyCt, MatID
From Properties
Group By MatID
Having NOT Count(Cast(UnKey as Int)) = 19)AS PrpCount
UNION
SELECT Header,'Material does not exist' as StatusMessage
FROM Materials Item
Where NOT EXISTS (Select ID
FROM MatMaster Mat
WHERE MAT.ID= Item.HEAD)
UNION
SELECT Header,'Material(s) not Complete' as StatusMessage
FROM Materials
Where MatID IN (Select ID
FROM MatMaster
WHERE INC ='Y')) as Valid
Where Valid.MatID = @MaterialID;

IF @MessageReturn IS NOT NULL

UPDATE dbo.Mat_DEV
SET Inco ='Y',
User_Message = @MessageReturn
WHERE MatID = @MaterialID

ELSE
UPDATE dbo.Mat_DEV
SET User_Message = 'No Validation Errors'
WHERE MatID = @MaterialID
4

3 回答 3

3

仅当您尝试将值放入不足以容纳该值的框中时,才会出现字符串或二进制数据。

现在,您实际上只是在两个地方写值,因此您的问题的候选者是:-

UPDATE dbo.Mat_DEV
SET Inco ='Y',
User_Message = @MessageReturn
WHERE MatID = @MaterialID

..或者..

UPDATE dbo.Mat_DEV
SET User_Message = 'No Validation Errors'
WHERE MatID = @MaterialID

检查这两个列( Inco 和 User_Message )的列定义。我的猜测是一个太小而无法容纳您要设置的值。

于 2012-07-17T10:56:24.253 回答
0

我有同样的问题。

当我直接执行存储过程时,一切正常。当我从 ASP.NET 调用相同的过程时,我得到“字符串或二进制数据将被截断”...

最后我意识到罪魁祸首是一个 varchar(20) 字段,其默认值为 'suser_sname()'...在 SQL Management Studio 中,用户名很短,从 ASP.NET 来看它超过 20 个字符...一个简单的 CAST解决了这个问题。:)

于 2013-08-07T06:53:11.567 回答
0

我的猜测是 User_Message 列没有足够的长度

于 2012-07-17T10:54:37.663 回答