안녕하세요.
Classic ASP 페이지와 MS-SQL 2000 사용중입니다.
7개의 컬럼이 있는 [테이블A]가 있습니다. (간략하게 컬럼명을 A~G 로 칭하겠습니다.)
[테이블A]
A char(8) Not Null <-- Clustered Primary Key
B char(8) Null
C char(6) Null
D char(2) Null
E char(1) Null
F char(40) Null
G char(1) Null
Collation은 Korean_Wansung_CI_AS 입니다.
INDEX:
PK__테이블A__7E11CC41 clustered, unique, primary key located on PRIMARY A
INSERT INTO [테이블A] (A, B, C, D, F)
(SELECT 'SS000179', convert(char(8), getdate(),112), sale_code, depart_code, '(주)테스트회사@내수@테스트현장 건물 본납' FROM [테이블B] where pd_code = 'DD000256')
이것은 [테이블2]라는 임시 테이블에 있는 레코드 값을 가져와서 [테이블A]에 등록해 주는 작업입니다.
이 때 오류가 나는데 오류 내용은 바이너리 값이 잘렸다는 내용입니다.
보통 이러한 에러는 컬럼의 크기보다 입력하려는 데이터의 크기가 클 경우 발생하는 것으로 알고 있습니다.
그런데 문제는 입력하려는 데이터의 크기가 컬럼의 크기를 초과하지 않는다는 것입니다.
동일한 작업을 하는 다른 건들은 모두 잘 입력되고 있는데 지금 위에 써 놓은 건만 에러를 발생 시킵니다.
더욱 이상한 점은 문제가 되는 저 쿼리문을 Response.write하여 웹상에 출력한 뒤 그 쿼리를 그대로 복사해서
쿼리분석기에 놓고 실행을 하면 정상적으로 Insert가 된다는 것입니다.
미칠 노릇이죠..ㅜㅜ
이럴 수가 있나요? ASP페이지에서는 오류를 내면서 문제가 되는 해당 쿼리문을 출력해 쿼리분석기에서 실행해보면
정상 처리되는 ... 이런경우...
그래서 혹시 ASP 페이지에서 사용하는 DBHelper쪽의 문제가 아닐까 생각도 드는데.. 소스 내용은 다음과 같습니다.
Public Sub RunSQL(strSQL, params, connectionString)
connectionString 설정부문 생략 ...
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = connectionString
cmd.CommandText = strSQL
cmd.CommandType = adCmdText
Set cmd = collectParams(cmd, params)
cmd.Execute , , adExecuteNoRecords <--- 요기서 에러발생
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
End Sub
에러 구문은 다음과 같습니다.
Microsoft OLE DB Provider for SQL Server error '80040e57'
String or binary data would be truncated.
이걸 DB쪽 문제로 봐야할지 ASP 쪽 문제라고 봐야할지... 난감하네요..
ASP쪽 문제라고 하기엔 다른 건들은 잘 처리가 되고 있고...
DB쪽 문제라고 하기엔 문제가 되는 저 건에 대한 입력 값들은 컬럼의 사이즈를 초과하지 않거든요...
소중한 조언 기다려 봅니다 ^^:
Comment 2
-
Larry
2015.01.13 14:10
문제의 원인을 찾았습니다.
쿼리문을 말씀하신대로 asp에서 직접 작성하여 실행하는데 이 쿼리문이 분석기에서는 정상 수행 되는데
asp로 실행하면 특정 컬럼의 길이 값이 초과하네요.
프로시저로 변환해서 실행하면 컬럼 길이를 초과하지 않을까요?
왜 asp에서 실행하면 컬럼 길이를 초과하는지 그 이유를 알 수 있을까요?
쿼리문을 asp에서 직접 작성해서 실행하나 봅니다. 프로시저로 변환하고 파라미너 바인딩 처리를 해 보시는건 어떨까요??
프로파일러를 이용해 실행되는 쿼리문을 수집해서 문제를 파악해 볼 수도 있습니다.