2009-12-02 3 views
7

SQL Server의 열을 int 유형에서 열 이름을 유지하면서 텍스트를 입력하려면 변경하고 싶습니다. 이 열이있는 표에는 많은 양의 데이터가 있으며 그 데이터를 잃고 싶지 않습니다. SQL Server는 int에서 텍스트로의 암시 적 또는 명시 적 형 변환을 지원하지 않는 것 같습니다. 그렇지 않으면 매우 간단합니다. 그렇다면 SQL 만 사용하면 어떻게됩니까?SQL Server에서 텍스트를 입력 할 int 형식의 열

+0

'text'또는 'varchar'? –

+1

문제를 해결하는 데 도움이되는 몇 가지 답변이 있지만 텍스트 데이터 형식에 "gotchas"가 많이 있다는 점을 추가하고 싶습니다. VARCHAR (MAX) 또는 NVARCHAR (MAX)를 사용하면 SQL 2005 이상에서 사용하는 것이 좋습니다. 그렇지 않은 경우에도 매우 큰 VARCHAR 또는 NVARCHAR을 대신 사용해보십시오. –

+0

nvarchar (max) 대신 텍스트를 사용해야하는 이유는 무엇입니까? – DForck42

답변

7

MS SQL Server (대부분의 데이터베이스와 마찬가지로)는 기존 열의 유형을 직접 변경하는 것을 지원하지 않으므로 단계적으로 변경해야합니다. 내가되어 과거에이 같은 문제를 해결 한 방법 (테이블 가정은 'foo는'이름과 열은 '바'이다) :

ALTER TABLE foo ADD COLUMN tempbar text; 
UPDATE foo SET tempbar = cast(cast(bar as varchar) as text); 
ALTER TABLE foo DROP COLUMN bar; 
ALTER TABLE foo ADD COLUMN bar text; 
UPDATE foo SET bar = tempbar; 
ALTER TABLE foo DROP COLUMN tempbar; 

(SQL 구문의 일부가 꺼져있을 수 있습니다, 그것은이었다 마지막으로 다른 일을 한 지 1 년이 지났기 때문에 MS SQL Server 나 소스에 액세스 할 수 없으며 열에 인덱스가 있으면 더 많은 작업을해야합니다.

Props에서 Donnie으로 변환 구문을 사용합니다.

Tom H.는 (단계 4-6 대신) tempbarbar으로 이름을 변경하기 sp_rename 저장 프로 시저를 사용하여 제안

[편집]. 이것은 여러 상황에서 작동 할 수있는 MS SQL Server 전용 솔루션입니다. 내가 설명한 솔루션 SQL 데이터베이스에 버전에 관계없이 (구문 수정) 함께 작동합니다. 필자는 단일 필드뿐만 아니라 기본 키와 외래 키를 다루었 기 때문에 신중하게 모든 작업을 주문하고 여러 버전의 MS SQL Server에 이식 할 수 있어야했습니다.

+1

대신 막대를 삭제하고 다시 추가 한 다음 막대를 채우는 대신 방금 삭제하고 임시 막대의 이름을 바꿀 수 있습니다. –

+0

sp_rename은 Sql CE에서 작동하지 않습니다. – Edgar

5

중간 유형을 통해 원하는대로 이중 캐스트하십시오.

cast(cast(intField as varchar) as text)

+0

시도해 보겠습니다. 감사! 왜 MS SQL이이 자체를 처리하지 않습니까? – manu08

+1

'text'는 특별하다. 평등한지 테스트 할 수없고, 풀 텍스트 인덱스를 사용해야한다. 그래서 텍스트 데이터를 포함하는 것으로 알려진 필드 만이 그것에 캐스트 될 수있다. – Donnie

0

여기 가능한 방법에 표시하는 작은 샘플 스크립트입니다 :

create table test (id int) 

create table test_tmp (id ntext) 


insert into test 
values (1) 
insert into test 
values (2) 

insert into test_tmp 
select convert(ntext,cast(id as nvarchar)) from test 

drop table test 

exec sp_rename 'test_tmp','test' 

은 기본적으로 우리가 테이블의 복사본을 만든 다음 채 웁니다. 먼저 int를 nvarchar로 변환 한 다음 텍스트 값으로 가져옵니다. 마지막으로 이전 테이블을 삭제하고 임시 테이블의 이름을 바꿉니다.

관련 문제