테이블의 열을 논리적으로 재정렬 할 수 있습니까?


93

Microsoft SQL Server의 테이블에 열을 추가하는 경우 쿼리에서 열이 논리적으로 표시되는 위치를 제어 할 수 있습니까?

디스크에있는 열의 물리적 레이아웃을 엉망으로 만들고 싶지는 않지만 가능한 경우 열을 논리적으로 그룹화하여 SQL Server Management Studio와 같은 도구가 테이블의 내용을 편리한 방식으로 나열하도록하고 싶습니다.

SQL Management Studio를 통해 테이블에 대한 "디자인"모드로 이동하고 열의 순서를 끌어서이 작업을 수행 할 수 있다는 것을 알고 있지만, 정렬을 수행 할 수 있도록 원시 SQL에서 수행 할 수 있기를 바랍니다. 명령 줄에서 스크립팅됩니다.


답변하기에는 너무 늦었지만이 링크를 살펴보십시오. blog.sqlauthority.com/2013/03/11/…
sqluser



그리고 그것이
Tim Abell

microsoft connect : 열 순서를 변경하기위한 ALTER TABLE 구문 -응답은 평소와 같이 초콜렛 주전자 다양성입니다. WONTFIX
Tim Abell

답변:


77

새 테이블을 생성하지 않고는 프로그래밍 방식으로 (안전한 방식으로)이를 수행 할 수 없습니다.

재정렬을 커밋 할 때 Enterprise Manager가 수행하는 작업은 새 테이블을 만들고 데이터를 이동 한 다음 이전 테이블을 삭제하고 새 테이블의 이름을 기존 이름으로 바꾸는 것입니다.

물리적 순서를 변경하지 않고 특정 순서 / 그룹으로 열을 원하는 경우 원하는대로보기를 만들 수 있습니다.


43

여기에있는 모든 사람들이 놓친 것은 모든 사람이 전국과 전 세계에 설치된 동일한 소프트웨어 시스템의 10, 20 또는 1000 인스턴스를 처리해야하는 것은 아니지만 상업적으로 판매되는 소프트웨어를 설계하는 우리 중에는 그렇게한다는 것입니다. 그 결과, 시간이 지남에 따라 시스템을 확장하고 새로운 기능이 필요하면 필드를 추가하여 테이블을 확장합니다. 이러한 필드가 기존 테이블에 속한다는 것이 확인되면 10 년 넘게 필드를 확장, 확장, 추가하는 등의 작업을 수행합니다. 테이블에 .... 그런 다음 설계, 지원, 때로는 원시 데이터를 파고 들어가거나 새로운 기능 버그를 디버그하기위한 문제 해결에 이르기까지 이러한 테이블을 사용해야합니다. .... 원하는 기본 정보가 없다는 사실이 엄청나게 악화되고 있습니다. 처음 소수의 분야에서 볼 수 있습니다.

나는 종종 이런 정확한 이유 때문에 이것을 할 수 있기를 바랐습니다. 그러나 SQL이 수행하는 작업을 정확히 수행하지 않고 내가 원하는 방식으로 새 테이블에 대한 스크립트 작성을 작성하고 Insert를 작성한 다음 기존 테이블에서 모든 기존 제약 조건, 관계, 키, 인덱스 등을 삭제하고 이름을 변경합니다. "새"테이블을 이전 이름으로 되 돌린 다음 모든 키, 관계, 색인 등을 읽습니다.

지루하고 시간 소모적 일뿐만 아니라 ... 5 년 후에 다시 발생해야합니다 ....

엄청난 양의 작업의 가치가 너무나 비슷하지만 요점은 ... 우리 시스템이 계속해서 성장하고, 확장하고, 필드가 뒤틀린 순서대로 필드를 확보 할 것이기 때문에이 능력이 필요한 마지막 시간은 아닙니다. 필요 / 디자인 추가.

대부분의 개발자는 단일 회사 또는 매우 특정한 하드 박스 시장에 서비스를 제공하는 단일 시스템 관점에서 생각합니다.

"기성품"이지만 시장 공간에서 상당히 진보적 인 디자이너와 개발 리더는 항상이 문제를 계속해서 처리해야합니다. 창의적인 솔루션이 있다면 창의적인 솔루션을 좋아할 것입니다. 이렇게하면 스크롤을 내리거나 소스 데이터 테이블에서 "해당"필드가 어디에 있는지 기억할 필요없이 일주일에 12 시간 씩 회사를 쉽게 절약 할 수 있습니다 ....


우리는 같은 문제를 겪었고이 프로세스를 자동화하는 저장 프로 시저를 만들었습니다 (이름 바꾸기, 새 테이블 만들기, 복사, 모든 외래 키, 제약 조건 등). 테이블 이름과 새로운 열 순서 만 전달하면됩니다. 이것이 실제로 회사에서 일주일에 수십 시간을 절약 할 수 있다면 비슷한 스크립트를 작성하는 데 시간을 투자해야합니다. 우리는 열을 재정렬하기 위해 일상적으로 사용하는 안정적인 스크립트를 얻는 데 약 2-3 일이 걸렸습니다. SqlServer에서 사용하는 모든 기능 (예 : 부분 인덱스, 인덱싱 된 뷰 등)을 처리하며 약 400 LOC로만 구성됩니다.
Andreas

나는 그들이 어떻게 든 열 레이아웃을 추상화 할 수없는 이유를 모르겠습니다. 열을 물리적으로 재정렬 할 필요가 없습니다! Sql Server의 엔지니어링 수준과 그 이상의 PHD 수준은 정말 놀랍습니다. 쿼리 계획 생성의 복잡성을 고려할 때 통계, 인덱싱 및 아무도 아직 일어나지 않았으며 '논리적 순서를 나타내는 테이블을 만들자. FieldID Guid, OrderBy int. 끝난. 그런 다음 SSMS 또는 SELECT *사용합니다. 완벽한 DBA이고 원하지 않으면 끄십시오. 매우 실망 스럽습니다. 그리고 이제 내 테이블은 더 이상 무차별 대입 할 수 없을만큼 충분히 커졌습니다.
Simon_Weaver

나는 이것이 오래된 주석이라는 것을 알고 있지만 데이터베이스 프로젝트 내의 Visual Studio는 테이블의 스키마를 변경하고 게시를 누르면 물리적 열 재정렬을위한 SQL 스크립트를 자동으로 생성합니다.
Muflix

5

귀하의 질문을 이해하면 기존 쿼리 에서 첫 번째, 두 번째, 세 번째 등이 반환되는 열에 영향을 미치고 싶 습니까?

모든 쿼리가 SELECT * FROM TABLE-로 작성된 경우 SQL에 배치 된대로 출력에 표시됩니다.

쿼리가 SELECT Field1, Field2 FROM TABLE-로 작성된 경우 SQL에서 배치되는 순서는 중요하지 않습니다.


3

Management Studio가이를 수행 할 때 임시 테이블을 만들고 모든 것을 복사하고 원래 테이블을 삭제하고 임시 테이블의 이름을 변경합니다. 이에 상응하는 간단한 T-SQL 문은 없습니다.

그렇게하고 싶지 않다면 원하는 순서대로 열이있는 테이블보기를 만들고 사용할 수 있습니까?

편집 : 구타!


1

한 가지 방법이 있지만 쿼리 자체에만 일시적으로 적용됩니다. 예를 들면

5 개의 테이블이 있다고 가정 해 보겠습니다. 테이블 호출T_Testing

FirstName, LastName, PhoneNumber, Email 및 Member_ID

ID, 성, 이름, 전화, 이메일을 차례로 나열합니다.

선택에 따라 할 수 있습니다.

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

그 외에 어떤 이유로 성 앞에 성을 표시하려는 경우 다음과 같이 할 수도 있습니다.

Select LastName, *
From T_Testing

확실히하고 싶은 것은 Where 또는 OrderBy를 사용하려는 경우 OrderBy 또는 Where 함수를 Table.Column으로 표시해야한다는 것입니다.

예:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

나는 이것이 도움이되기를 바랍니다. 나는 이것을 스스로해야했기 때문에 그것을 알아 냈습니다.


이 쿼리에서 Select LastName, * From T_Testing에서 LastName을 두 번 얻습니다.
sqluser

1
  1. 쿼리 창에 기존 테이블을 스크립팅합니다.
  2. 테스트 데이터베이스에 대해이 스크립트를 실행합니다 (Use 문 제거).
  3. SSMS를 사용하여 필요한 열 변경
  4. 변경 스크립트 생성을 클릭합니다 (기본적으로 버튼 모음의 맨 왼쪽 및 맨 아래 아이콘).
  5. 실제 테이블에 대해이 스크립트 사용

스크립트가 실제로하는 일은 원하는 열 순서로 두 번째 테이블 테이블을 만들고 모든 데이터를 여기에 복사 한 다음 원래 테이블을 삭제 한 다음 보조 테이블의 이름을 바꾸는 것입니다. 이것은 배포 스크립트를 원할 경우 직접 작성하는 것을 절약합니다.



0

전체 테이블을 다시 생성하지 않고 열 순서를 변경할 수 없습니다. 데이터베이스 인스턴스가 몇 개만있는 경우이를 위해 SSMS를 사용할 수 있습니다 (테이블을 선택하고 "디자인"을 클릭하십시오).

수동 프로세스를위한 인스턴스가 너무 많은 경우 다음 스크립트를 시도해야합니다. https://github.com/Epaminaidos/reorder-columns

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.