database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 5939 게시물 읽기
No. 5939
sql 2005 업데이트시 컬럼 크기 관련 에러
작성자
다크나인(prokoo)
작성일
2011-08-19 10:52
조회수
7,026

asp 프로그램에서 sp 함수로 DB내 sp로 데이터를 보내 업데이트 시키는 구조입니다.

에러메세지
1. asp(웹)에서는 데이터 및 이진데이터가 잘립니다.라고 나오구
2. DB내에서 바로 값 넣어서 테스트 해본 결과 최대길이 128을 초과하였습니다. 라고 나옵니다.

이번에 한 컬럼의 크기를 varchar(300)에서 varchar(1500)으로 변경하고
이 컬럼에 들어가는 값은

다음에서 정하는 것 이외의 보존료가 검출되어서는 아니된다. 0.5 이하 소르빈산으로서 1.0 이하 안식향산으로서 소르빈산으로서 및 안식향산으로서 병용할 때에는 사용량의 합계가 1.5g/kg 이하 이어야 하며 그 중 소르빈산으로서의 사용량은 0.5g/kg이하 이어야 한다

입니다.

영문 1바이트로 계산했을 대 대략 340이 넘고, 한글로 계산하면 대략 170정도 되겠네요..

에러메시지 1의 경우 검색해본 결과 컬럼 크기랑 맞지 않아 오류다 라는 답변들이 많고,
2의 경우 set QUOTED_IDENTIFIER ON  <<< 이 옵션을 OFF로 하면 된다라고 해서
SSMS로 접속 후 해당 SP>오른쪽마우스클릭>수정으로 들어가서 위의 옵션을 OFf로 하고 실행(F5)로 명령수행한 후
다시 테스트 해보니 그래도 같은 오류메세지가 뜨더군요...

더 검색해본 결과 도구>옵션>쿼리결과 에서 각 열에 표시할 최대 문자 수가 256으로 되어 있어서 이걸 512로
바꿔 적용시켰습니다.

그리고, 다시 테스트... 같은 오류 메세지가 뜨네요...

아이공.... 이 오류로 인해 너무 오래 알아보는데도 해결책이 보이지 않네요...

우선 asp 내 sp 함수 내용을 올려봅니다.

Function UpdateAnalysisResultInfo_Test(analysis_idx,report_result_kor,report_result_eng,test_method,judge,file_name,result_input_user_id,exam_value)

Set objCmd = Server.CreateObject("ADODB.Command")
with objCmd
.ActiveConnection = conn
 .CommandText = "sp_UpdateAnalysisResultInfo_Test"
 .CommandType = adCmdStoredProc
 .Parameters.Append .CreateParameter("@analysis_idx",adInteger,adParamInput)
 .Parameters.Append .CreateParameter("@report_result_kor",adVarchar,adParamInput,100)
 .Parameters.Append .CreateParameter("@report_result_eng",adVarchar,adParamInput,100)
 .Parameters.Append .CreateParameter("@test_method",adVarchar,adParamInput,200)
 .Parameters.Append .CreateParameter("@judge",adTinyInt,adParamInput)
 .Parameters.Append .CreateParameter("@file_name",adVarchar,adParamInput,100)
 .Parameters.Append .CreateParameter("@result_input_user_id",adVarchar,adParamInput,20)
 .Parameters.Append .CreateParameter("@exam_value",adVarchar,adParamInput,1500)   ' 이넘이 바뀐 컬럼

 .Parameters("@analysis_idx")             = analysis_idx
 .Parameters("@report_result_kor")        = report_result_kor
 .Parameters("@report_result_eng")        = report_result_eng
 .Parameters("@test_method")   = test_method
 .Parameters("@judge")    = judge
 .Parameters("@file_name")                = file_name
 .Parameters("@result_input_user_id")     = result_input_user_id
 .Parameters("@exam_value")     = exam_value
 .Execute
 End with
 Set objCmd = Nothing 

End Function

 


이 함수로 값을 보내는 코드는

if(analysis_idx <> "") then

 analysis_idx_name  = "analysis_info_"&i
 report_result_eng_name  = "report_result_eng_"&i
 report_result_kor_name  = "report_result_kor_"&i
 test_method_name  = "test_method_"&i
 judge_name   = "judge_"&i
 exam_value_name   = "exam_value_"&i
 chk_toggle_name   = "chk_toggle"&i      '파일삭제 checkbox
 sub_idx    ="sub_idx_"&i
 'analysis_idx   = Trim(xup(analysis_idx_name))    
 file_temp_name   ="file_temp_"&i&"_"&analysis_idx
 report_result_kor  = Trim(xup(report_result_kor_name))
 report_result_eng  = Trim(xup(report_result_eng_name))
 test_method   = Trim(xup(test_method_name))
 judge    = Trim(xup(judge_name))
 exam_value   = Trim(xup(exam_value_name))
 chk_toggle   = Trim(xup(chk_toggle_name))
 file_name   = arrNoteFile(i-1)  
 
 sub_idx    = Trim(xup(sub_idx))
 file_temp   =  Trim(xup(file_temp_name))

 if(chk_toggle <> "") then 'check 표시가 되어 있으면
 DeleteAnalysisFile analysis_idx,file_temp
 end if

 report_result_eng =  TransEngResult(report_result_kor)      

 UpdateAnalysisResultInfo_Test analysis_idx,report_result_kor,report_result_eng,test_method,judge,file_name,result_input_user_id,exam_value
end if  

이 부분입니다.

그리고, DB 내 SP 코드는

set ANSI_NULLS ON
set QUOTED_IDENTIFIER OFF
GO
ALTER proc [dbo].[sp_UpdateAnalysisResultInfo_Test]
 @analysis_idx  int
, @report_result_kor  varchar(100)
, @report_result_eng  varchar(100)
, @test_method   varchar(200)
, @judge    tinyint
, @file_name  varchar(100)
, @result_input_user_id  varchar(20)
, @exam_value   varchar(1500)
as

declare  @trimed_file_name varchar(100)

set @trimed_file_name   = RTrim(LTrim(@file_name))

if(@trimed_file_name != '')
Begin
 Update ILIMS_ANALYSIS
 set report_result_kor   = @report_result_kor
 , report_result_eng  = @report_result_eng
 , test_method   = @test_method
 , judge    = @judge
 , file_name   = @file_name
 , decesion_yn  = 'Y'
 , judge_date   = getdate()
 , result_input_date  = getdate()
 , result_input_user_id = @result_input_user_id 
 , exam_value   = @exam_value
 where idx    = @analysis_idx
end
else
begin
 Update ILIMS_ANALYSIS
 set report_result_kor   = @report_result_kor
 , report_result_eng  = @report_result_eng
 , test_method   = @test_method
 , judge    = @judge
 , decesion_yn  = 'Y'
 , judge_date   = getdate()
 , result_input_date  = getdate()
 , result_input_user_id = @result_input_user_id
 , exam_value   = @exam_value
 where idx    = @analysis_idx
end

입니다.

풀어보면...asp 페이지에서 input으로 넘어온 값을 함수 sp를 통해 DB내 sp로 값을 보내 쿼리를 실행하는 구조인데요...

문제의 컬럼 값

다음에서 정하는 것 이외의 보존료가 검출되어서는 아니된다. 0.5 이하 소르빈산으로서 1.0 이하 안식향산으로서 소르빈산으로서 및 안식향산으로서 병용할 때에는 사용량의 합계가 1.5g/kg 이하 이어야 하며 그 중 소르빈산으로서의 사용량은 0.5g/kg이하 이어야 한다

에서

다음에서 정하는 것 이외의 보존료가 검출되어서는 아니된다. 0.5 이하 소르빈산으로서 1.0 이하 안식향산으로서 소르빈산으로서 및 안식향산으로서 병용할 때에는 사용량의 합계가 1.5g/kg 이하 이어야 하며 그 중

로 뒤의 값을 조금 삭제 후 실행하면 업데이트가 실행됩니다...

 

에효...


DB내 컬럼 크기 설정때문인지 원인을 못 찾고 있습니다...

고수님들...답변 바랍니다... 이거땜에 미치고 있어염....ㅜ.ㅜ

이 글에 대한 댓글이 총 3건 있습니다.

DATALENGTH()함수로 바이트를 계산해 보면 '다음에서...이어야 한다'가 249바이트가 나오는데요

혹시 exam_value  컬럼의 크기는 어떻게 되는지요? 보통은 컬럼 크기가 작아서 나는 에러같은데요

착한넘(agoodman99)님이 2011-08-19 17:53에 작성한 댓글입니다.

컬럼 크기는 varchar 1500 입니다.

제가 이상해서 이 exam_value 컬럼을 빼고 DB에서 바로 업데이트 시켜봤는데요...

Update ILIMS_ANALYSIS
set
report_result_kor = '200'
, report_result_eng = '200'
, test_method = '식품공전'
, judge = '1'
, decesion_yn = 'Y'
, judge_date = getdate()
, result_input_date = getdate()
, result_input_user_id = '관리자'

where

idx = 547912

 

보통 위와 같은 값이 들어갑니다...

그런데 그 한글이 많은 컬럼을 빼고 해봐도 같은 에러가 납니다...

메시지 8152, 수준 16, 상태 14, 프로시저 IsJudgedAll, 줄 22
문자열이나 이진 데이터는 잘립니다.

이런 에러욤...

위의 프로시저 IsJudgedAll은 어디에 있는지 찾을 수가 없네요... 그냥 시스템 sp인건지...ㅋ~

이상하게 한글많은걸 빼도 에러가 나니...에휴...

컬럼이 틀린건지..

데이터형식과 크기는 함수프로시저에 있는 값하고 동일하거던염...ㅜ.ㅜ

 

다크나인(prokoo)님이 2011-08-19 18:28에 작성한 댓글입니다.

자체 해결했습니다...
모든 답변들 감사드립니다...
제가 허접이라 DML 트리거가 있는지도 몰랐네욤...
트리거로 연결된 테이블의 컬럼 크기가 틀려서 에러가 난거였어염...^^;

 

다크나인(prokoo)님이 2011-08-23 15:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5942Numeric Field 숫자 별로 더해서 변수로 저장... [1]
pipe
2011-09-05
6040
5941DB제대로 된 설계인지 궁금해서 질문드립니다. [1]
DB설계초보자
2011-08-23
6776
5940여러조건의 갯수 구하기 쿼리 질문입니다. [2]
최지훈
2011-08-22
7191
5939sql 2005 업데이트시 컬럼 크기 관련 에러 [3]
다크나인
2011-08-19
7026
5938Truncate 시 Deadlock 관련
무적
2011-08-18
6280
5937운영데이터를 개발서버로 이관하려고 합니다.2008 R2버전입니다. [2]
자민
2011-08-18
6174
5936Week관련 [1]
박판규
2011-08-17
6595
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다