2014-11-26 5 views
1

임의의 설정 값이 VARCHAR(255) 값으로 저장되는 테이블을 처리하고 있습니다. 내가 처리해야하는 특별한 하나는 증가되어야하고 호출자에게 리턴 될 필요가있는 시퀀스 번호입니다. (다시 말하지만, "number"라는 시퀀스는 VARCHAR으로 저장되어 있습니다.SQL - char 값을 "증가"하면 데이터 정렬 오류가 발생합니다.

시퀀스 번호이기 때문에 별도의 단계로 선택하고 업데이트하고 싶지 않습니다. 나는 실제 숫자 필드와 과거에 이런 종류의 처리했으면, 내 방법은 값을 증가시키고 나에게 하나의 팽창의 foop에서 업데이트 된 값을 제공

UPDATE TABLE SET @SEQ_NUM = VALUE = VALUE + 1 

같은 것을하고있다. 나는이 상황에서, 내가 캐스트와 같은 기본적인 것을 시도 할 거라고 생각 :

DECLARE @SEQ_NUM VARCHAR(255) 

UPDATE SOME_TABLE 
    SET @SEQ_NUM = VALUE = CAST((CAST(VALUE AS INT) + 1) AS VARCHAR) 
WHERE NAME = 'SOME_NAME' 

실제 업데이트가 너무 오래 내가 변수에 결과를 할당하려고하지 않는 한 잘 작동을; 최대한 빨리처럼, 나는 다음과 같은 오류가 나타납니다

Msg 549, Level 16, State 1, Line 4 The collation 'SQL_Latin1_General_CP1_CI_AS' of receiving variable is not equal to the collation 'Latin1_General_BIN' of column 'VALUE'.

나는 그게 무슨 뜻인지 이해를하지만, 나는 그것이 일어나는 이유를 이해, 또는 어떻게 문제를 해결하는 방법 확장으로하지 않습니다.

특정 오류를 수정하는 대신, 문자 시퀀스 "숫자"를 증가시키는 대체 방법에 대한 제안을 환영합니다.

+1

왜 자신의 시퀀스 번호를 유지하려고하십니까? 동시성과 같은 문제가 있습니다. 이것을 고안 한 사람이 생각하지 않았기 때문에 여기에서 느슨한 전투에 맞설 것입니다. –

+0

아마도 'COLLATE' 키워드를 사용하여 문제를 해결할 수 있습니다. –

+0

@SeanLange, 나를 믿어 라. 알아. 다행스럽게도이 특별한 사용 사례는 자주 행사되지 않지만 대규모 PITA입니다. – Ickster

답변

1

을 코멘트 중 하나에서 것은 내가 추천 할 것입니다 무엇 :

UPDATE TABLE 
SET VALUE = CAST((CAST(VALUE AS INT) + 1) AS VARCHAR) 
OUTPUT inserted.VALUE 
WHERE NAME = 'SOME_NAME' 

SELECT 문과 같이 새 값을 출력합니다. 또한 inserted.VALUEint으로 캐스팅 할 수 있습니다 (SQL에서 해당 작업을 수행하려는 경우). 당신이 @SEQ_NUM에 값을 넣어 대신 문/저장 프로 시저에서 값을하고 출력하기 위해 원하는 경우

, 당신은 스칼라 변수를 사용할 수는 없지만과 같이, 테이블 변수로 펌프 수 있습니다

DECLARE @SEQ_NUM AS TABLE (VALUE VARCHAR(255)); 

UPDATE TABLE 
SET VALUE = CAST((CAST(VALUE AS INT) + 1) AS VARCHAR) 
OUTPUT inserted.VALUE INTO @SEQ_NUM (VALUE) 
WHERE NAME = 'SOME_NAME' 

SELECT VALUE FROM @SEQ_NUM 
+0

그게 지금 제가하고있는 일입니다. 저장 프로 시저에서이 업데이트를 수행하고 값을 반환해야합니다. 출력을 테이블 var에 삽입하고 값을 다시 선택하는 것보다 효율적인 대안이 있습니까? 테이블에 var를 삽입하지 않으면 OUTPUT 연산에 익숙하지 않습니다. – Ickster

+0

그래서이 두 코드 블록은 똑같은 일을 할 것입니다 - 저장 프로 시저에서 새로운 값을 출력하십시오. sproc에서 값을 조작 할 필요가없는 경우 첫 번째 블록을 사용하고 코드에서 반환 된 데이터를 읽을 때 (예 : ExecuteScalar를 통해) 새 값을 갖습니다. – nateirvin

0

수동으로 순차 번호를 유지하는 것은 결코 해결하고 싶지 않지만이 문제를 해결할 수있는 제약이 있음을 이해할 수 있습니다.

2 단계로 나누면 문제를 해결할 수 있습니다. 이 예제 코드가 작동하려면 내가 당신의 WHERE 절을 대체했습니다 참고 : 여기 당신은 이미이에 명중 한 수처럼 들리 겠지만,

CREATE TABLE #SOME_TABLE ([VALUE] VARCHAR(255)) 

INSERT INTO #SOME_TABLE 
     (VALUE) 
VALUES ('12345') 

DECLARE @SEQ_NUM VARCHAR(255) 

UPDATE #SOME_TABLE 
SET  [VALUE] = CAST((CAST([VALUE] AS INT) + 1) AS VARCHAR(255)) 
WHERE 1 = 1 

SELECT * 
FROM #SOME_TABLE 

SELECT @SEQ_NUM = [VALUE] 
FROM #SOME_TABLE 
WHERE 1 = 1 

SELECT @SEQ_NUM 

DROP TABLE #SOME_TABLE 
+0

아직이 대체 방법을 시도해 보지 못했지만 쿼리에서 테이블 var 및 OUTPUT 절을 사용하는 것 외에는 비슷한 접근 방식을 생각하고있었습니다. – Ickster