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

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

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

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



답변

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

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

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


답변

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

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

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

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

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

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


답변

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

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

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


답변

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

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

편집 : 구타!


답변

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

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

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


답변

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

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


답변

시스템 테이블을 직접 수정하여 SQL을 사용하여 수행 할 수 있습니다. 예를 들어, 여기를보십시오 :

테이블 변경-사이에 새 열 추가

그러나 절대적으로 필요한 경우가 아니면 시스템 테이블을 가지고 노는 것을 권장하지 않습니다.