2012-07-17 1 views
0

오류없이 컴파일되는 MS SQL 2008에 저장 프로 시저가 있지만 저장 프로 시저를 실행하면 '문자열 또는 이진 데이터가 잘 리게됩니다. ' 불행히도, 나는 이것이 어디에서 일어나고 있는지 추적 할 수 없다.문자열 또는 이진 데이터를 보면 저장 프로 시저를 실행할 때 잘릴 수 있습니다. 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 
+3

테이블'ID' 필드는 실제로'varchar (max)'입니까? 암시 적 전환이 어떻게 작동하는지 알고 있습니까? –

+0

이상하게 보입니다. select의 결과를 @ MessageReturn에 할당하지 않고, 모든 체크 후에 MaterialID를 사용하여 필터를 적용합니다. 그러면 나중에 폐기 될 테이블의 모든 레코드에 대해 수행됩니다. 각 하위 쿼리에서 검색 조건을 반복해야한다고 생각합니다. –

답변

0

내 생각 엔 그 열 USER_MESSAGE 충분한 길이없는 것입니다

+0

죄송합니다. 닫았습니다. 오류를 던지고있는 다른 필드 였지만 오류 메시지가 정확한 위치를 가리키고 있지 않습니다. – Andy5

2

문자열 또는 이진 데이터는 값을 유지하기에 충분하지 않은 상자에 값을 넣을 때만 잘립니다. 이제

, 당신은 실제로 두 곳에서 값을 쓰고있어, 그래서 문제에 대한 후보는 다음과 같습니다 -

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). 내 추측은 너무 작아서 당신이 원하는 값을 유지할 수 없다는 것입니다.

+0

+1 그리고''Y ''를 수용 할 수없는 길이의 문자열 열을 가질 수 없기 때문에 INCO라고 의심합니다. –

0

나는 동일한 문제가있었습니다.

저장된 proc을 직접 실행하면 모든 것이 제대로 작동합니다. ASP.NET에서 같은 proc을 호출하면 '문자열 또는 이진 데이터가 잘 리게됩니다.'...

마지막으로 주범은 ' '... SQL Management Studio에서 사용자 이름이 짧았습니다. ASP.NET에서 20 자 이상이었습니다 ... 간단한 CAST가 문제를 해결했습니다. :)

관련 문제