2009-04-20 5 views
28

SQL Server의 특정 순서대로 테이블에 열을 추가 할 수 있습니까?특정 순서로 새 테이블 열 추가

예를 들어, 우리 테이블은 항상 각 테이블 정의의 "끝에"CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy 컬럼을 가지고 있습니까? 새 열을 SSMS에서이 열 위에 표시하고 싶습니다.

모든 데이터베이스 변경 사항을 스크립팅하고 있다면 테이블 끝에이 순서를 유지할 수있는 방법이 있습니까?

참고로이 작업을 수행해야하는 경우 불꽃 전쟁을 준비하는 것이 아닙니다. 당신이로 빠르게 퇴화 스레드에 대한 읽으려면, 여기에 좋은 하나 :

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

+0

아니면 모든 테이블 위에 뷰를 생성해야하는 이유는 무엇입니까? –

+0

관련 : http://stackoverflow.com/q/1605144/12484 –

답변

23

는 원래 테이블의 스키마를 반영하지만 당신이 원하는 열 순서와 임시 테이블을 만들어야합니다, 그런 다음 원고의 내용을 임시로 복사하십시오. 원본을 삭제하고 임시 이름을 바꿉니다.

이것은 SQL Management Studio가 백그라운드에서 수행하는 것입니다.

스키마 동기화 도구를 사용하면 이러한 스크립트를 자동으로 생성 할 수 있습니다.

+0

Temp 테이블은 'tempdb'외부에서 이름을 바꿀 수 없습니다. –

3

SQL Server 관리 Studio로 이동하여 기존 테이블을 "디자인"하십시오. 중간에 열을 삽입하고 작성한 스크립트를보십시오. 기본적으로 적절한 열 순서로 임시 테이블을 만들고 원래 테이블의 데이터를 삽입하고 원래 테이블을 삭제하고 임시 테이블의 이름을 바꿉니다. 이것은 아마도 당신이해야 할 일입니다.

3

제 지식에는 컬럼의 순서를 변경하는 알려진 방법이 없습니다. SQL Management Studio에서는 Jose Basilio가 말한 것을 수행합니다. 그리고 큰 테이블을 가지고 있다면 이런 방식으로 컬럼 순서를 변경하는 것은 비현실적입니다.

"보기"를 사용할 수 있습니다. SQL 뷰를 사용하면 테이블 열 변경의 영향을받지 않고 원하는 모든 순서를 사용할 수 있습니다.

0

테이블 구조의 특정 서수 위치에 열을 만들 수 없습니다. - 그 이유는 무엇입니까? SQL Server에서 열의 순서는 완전히 관련이 없습니다.

SQL Server Management Studio에는 열 목록의 모든 위치에서 열을 만들 수있는 디자인보기가 있습니다. 그러나 실제로 여기서 발생하는 것은 새 열이있는 새 테이블이 만들어지고 오래 된 하나 떨어졌다 가져옵니다.

특정 위치에 열을 만들거나 열을 "재정렬"할 수있는 SQL DDL 명령이 없습니다. 그것은 정말로 필요하지 않습니다.

마크

+4

왜 하시겠습니까? 그래서 SSMS에서 사물을 보는 것이 더 쉽습니다. 예를 들어, 제품이 공장을 통해 진행하는 타임 스탬프 세트로 구성된 테이블을 가지고 있다면 자연스럽게 데이터베이스에 순서대로 저장하면 앞뒤로 많이 움직이지 않고 데이터를 읽는 데 도움이됩니다. 그렇습니다. 코드 작성은 중요하지 않지만 디버깅 할 때인지 부하를 줄이는 데 도움이됩니다. –

+0

@ 콜린 맥케이 : 그렇습니다. 그것이 바로 전망입니다. 디버깅 후 삭제하는 것을 잊지 마십시오. –

7

대답은 '예, 그것은 기술적으로 가능하지만, 당신은 두통이 그렇게해야합니다 그것을 실행하고 설정하는 데 시간이 오래 걸릴 것입니다.

하나 : 여기가 발생하고 '저장'을 클릭하면 실행되는 스크립트의 예 :/복사/드롭/이것은 SQL Server가 그래픽 인터페이스에서하고있는 사실은 무엇

이름 바꾸기 만들기 테이블의 시작 부분에 새 열을 추가 한 후 버튼을 누릅니다.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_SomeTable 
    (
    MyNewColumn int NOT NULL, 
    OriginalIntColumn int NULL, 
    OriginalVarcharColumn varchar(100) NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON 
GO 
IF EXISTS(SELECT * FROM dbo.SomeTable) 
    EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF 
GO 
DROP TABLE dbo.SomeTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO 

GO 
COMMIT 

2 :이 방법은 기본적으로 당신의 새로운 컬럼의 권리 '에 추가 할 기존 컬럼의 복사본을 만드는 작업이 포함됩니다

RENAME/COLUMN/UPDATE/DROP 열을 추가, 데이터를 새 열로 전송 한 다음 원본을 삭제하고 새 열의 이름을 바꿉니다. 이것은 당신이 그들을 repoint해야하기 때문에 당신이 가지고있는 어떤 인덱스 나 제약으로 혼란을 일으킬 것입니다. 기술적으로 가능하지만 개발과 실행 측면에서 시간이 많이 걸립니다.

CREATE TABLE MyTest (a int, b int, d int, e int) 

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5) 

SELECT * FROM MyTest -- your current table 

ALTER TABLE MyTest ADD c int -- add a new column 
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move 
ALTER TABLE MyTest ADD e_new int 

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns 

ALTER TABLE MyTest DROP COLUMN d -- remove the originals 
ALTER TABLE MyTest DROP COLUMN e 

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns 
EXEC SP_RENAME 'MyTest.e_new', 'e'; 

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample 

세 : 그것은

이 꽤나 질서의 감각을 기분을 상하게와 라이브 ...하지만 때로는, 그냥 가치가 개편되지 않습니다.

0

TFS 2013이 자동으로을 수행합니다.

원하는대로 표에 새 열을 추가 한 다음 변경 사항을 TFS에 적용하십시오. 거기에서 Visual Studio에서 테이블의 sql 파일을 열고 T-SQL CREATE 스크립트의 열 순서를 수동으로 이동할 수 있습니다. 그런 다음 Tools> SQL Server> New Schema Comparison 아래에있는 VS의 스키마 비교 도구를 사용하여 대상 데이터베이스를 업데이트 할 수 있습니다. 변경 내용을 원본으로 사용하여 데이터베이스 프로젝트를 선택하고 대상으로 업데이트 할 데이터베이스를 선택하십시오. 테이블의 스크립트를 비교하고 선택하고 업데이트하십시오. VS가 자동으로 삭제되고 추가됩니다. 모든 데이터가 안전하고 색인이 생성됩니다.

0

지저분하고 간단합니다.
표를 CSV로 내보내기.
새 데이터를 원하는 위치에 삽입하십시오.
드롭 테이블.
원하는 열 지정으로 새 테이블을 만듭니다.
csv에서 새 테이블로 열을로드하십시오.

관련 문제