SQL Server 2005에서 SQL 쿼리를 사용하여 테이블의 열 순서를 변경하는 방법은 무엇입니까?


109

SQL Server 2005에서 SQL 쿼리를 사용하여 테이블의 열 순서를 변경하는 방법은 무엇입니까?

SQL 쿼리를 사용하여 테이블의 열 순서를 재정렬하고 싶습니다.


3
테이블에 존재하는 열의 위치 를 변경하는 것을 언급하는 경우 선호하는 순서로 새 테이블을 만들고 이전 테이블의 데이터를 삽입 한 다음 원래 테이블을 삭제해야합니다. (내가 아는 한) 다른 방법은 없습니다.
Michael Todd

SELECT 문의 열 순서 또는 테이블 정의의 열 순서에 대해 이야기하고 있습니까?
marc_s

답변:


111

당신은 할 수 없습니다. 열 순서는 우리 인간이 신경 쓰는 "외관 적"일뿐입니다. SQL Server에 대해서는 거의 항상 절대적으로 관련이 없습니다.

열 순서를 변경할 때 SQL Server Management Studio가 백그라운드에서 수행하는 작업은 새 CREATE TABLE명령으로 처음부터 테이블을 다시 만들고 이전 테이블의 데이터를 복사 한 다음 삭제하는 것입니다.

열 순서를 정의하는 SQL 명령이 없습니다.


4
아니요, SQL Server에는 그런 것이 없습니다. 실제 RBDMS에 있어서는 안됩니다. 열 순서는 SQL 테이블과 관련된 개념이 아닙니다.
marc_s

68
@marc_s 열 순서를 지원하는 데에는 타당한 이유가 없습니다. 시각적 일지라도. "SELECT *"를 만들 때 주어진 열 순서로 테이블의 데이터를보다 쉽게 ​​볼 수 있습니다. 저는 개발자이고 항상 이런 종류의 쿼리를 수행합니다. 미리 정의 된 적절한 열 순서로 시간을 할애 할 수 있습니다. 물론 다른 관점에서는 의미가 없습니다. 열 순서에 의존하는 것은 없습니다. 그런데 "INFORMATION_SCHEMA.COLUMNS"를 쿼리 할 때 ORDINAL_POSITION 열이 있습니다. 그게 무슨 뜻인지 모르겠지만 ... 이것과 관련이있는 게 분명 해요.
JotaBe 2013-06-21

18
예를 들어 열 이름을 지정하지 않고 INSERT INTO를 사용할 때 열 순서가 관련됩니다. 또 다른 예는 열 이름 대신 ORDER BY 열 인덱스입니다. 둘 다 권장되지는 않지만 SQL Server에서는이를 허용하므로 누군가 어딘가에서 사용하여 열 순서를 변경할 때 T-SQL 코드가 손상 될 수 있습니다.
Carvellis

12
@Carvelis : 당신이해야 결코 사용하지 INSERT명시 적으로 열을 어쨌든 지정하지 않고!
marc_s

2
@marc_s : 물론입니다.하지만 일반적으로 프로젝트에서 작업하는 사람은 저뿐이 아닙니다. 사람들이 이런 종류의 코드를 사용하는 프로젝트를 꽤 많이 보았습니다.
Carvellis

30

'기본'순서에 *를 사용하는 대신 반환 할 순서대로 필드를 명시 적으로 나열해야합니다.

원래 검색어 :

select * from foobar

보고

foo bar
--- ---
  1   2

지금 쓰다

select bar, foo from foobar

bar foo
--- ---
  2   1

위의 대답은 틀 렸습니다. 이 답변은 말 그대로 열을 정렬하는 방법을 보여줍니다. 왜 이전 열에는 체크 표시가 있고이 답변은 그렇지 않습니까?
요원 Lu

1
@Agent Lu 문제는 원래 질문의 표현입니다. Marc와 나는 '열 순서 변경'에 대한 OP의 질문을 다르게 해석했습니다. 그는 저장된 테이블에서 열 순서가 무관 한 이유를 강력하게 주장합니다 (이름은 그렇습니다). 다른 열 순서로 데이터를 추출하는 방법을 보여주었습니다. 전혀 같은 것이 아닙니다!
lexu

23

http://msdn.microsoft.com/en-us/library/aa337556.aspx 에 따르면

이 작업은 Transact-SQL 문을 사용하여 지원되지 않습니다.

글쎄, 그것은 komma8.komma1의 답변대로 create/ 복사 / drop/ 이름 바꾸기를 사용하여 수행 할 수 있습니다.

또는 SQL Server Management Studio를 사용할 수 있습니다.

  1. 에서 개체 탐색기 , 당신이 순서를 원하는 열이있는 테이블을 마우스 오른쪽 단추로 클릭 디자인 (이전 버전에 수정을. 2005 SP1 또는)
  2. 재정렬 할 열 이름 왼쪽에있는 상자를 선택합니다. (키보드에서 [shift] 또는 [ctrl] 키를 눌러 여러 열을 선택할 수 있습니다.)
  3. 열을 테이블 내의 다른 위치로 끕니다.

그런 다음 저장을 클릭하십시오. 이 방법은 실제로 테이블을 삭제하고 다시 생성하므로 일부 오류가 발생할 수 있습니다.

경우 변경 내용 추적 옵션은 데이터베이스와 테이블을 사용,이 방법을 사용하면 안됩니다.

비활성화 된 경우 도구 메뉴> 옵션> 디자이너에서 테이블 다시 생성이 필요한 변경 사항 저장 방지 옵션을 지워야합니다. 그렇지 않으면 "변경 사항 저장이 허용되지 않음" 오류가 발생합니다.

  • 테이블을 다시 생성 할 때 기존 변경 내용 추적 정보가 삭제 되므로 테이블 다시 생성이 필요한 변경 내용 저장 방지 옵션을 비활성화하는 것은 Microsoft에서 강력히 권장합니다. 따라서 변경 내용 추적이 활성화 된 경우이 옵션을 비활성화 해서는 안됩니다. 활성화되었습니다!

기본 및 외래 키 생성 중에 문제가 발생할 수도 있습니다.

위의 오류가 발생하면 저장에 실패하여 원래 열 순서가 유지됩니다.


1
This task cannot be performed using Transact-SQL statements.문서의 " " 문구 가 잘못되었습니다. 저자를 설명하고 " This task is not supported using Transact-SQL statements." 로 변경해달라고 요청했습니다 . 약 하루 전에 저자가 동의하고 문서가 수정되었습니다. GitHub에서 논의한 내용을 따를 수 있습니다 .
Ronen Ariely

@RonenAriely 잘 했어, 알려 주셔서 감사합니다. 나는 내 대답을 업데이 트
robotik

@robotik 😀 가장 환영합니다. 여기에 와서 가장 많은 표를 얻은 응답을 보는 모든 사람들이 그것이 완전한 실수라는 것을 이해하기를 바랍니다. 안타깝게도 커뮤니티는 일반적으로 무리 (소)처럼 행동하고 커뮤니티의 리더와 최고 기여자 (최고 전문가로 간주되는)가 실수를하면이 스레드에서와 같이 다른 사람들이 그를 따릅니다. 사람들은 이미 많은 표를 얻은 경우 계속해서 실수에 투표하고 ( "모든 사람이 그렇게 말하면 사실입니다"라는 접근 방식) 포럼에 올 다른 사람들은 이것이 정답이라고 생각할 것입니다.
Ronen Ariely

1
@RonenAriely 그래서 나는 항상 아래로 스크롤합니다 :)
robotik

13

이것은 질의의 결과로 레코드를 정렬하는 질문과 유사하며 일반적으로 공식적으로 정답을 좋아하는 사람은 없습니다 ;-)

그래서 여기에 간다 :

  • SQL 표준에 따라 테이블의 열은 "순서"가 아닙니다.
  • 결과적으로 a select *는 열이 특정 순서로 반환되도록 강제하지 않습니다.
  • 일반적으로 각 RDBMS에는 일종의 "기본"순서가 있습니다 (일반적으로 열이 테이블에 추가 된 순서, create table' or in thealter table add`문에서
  • 따라서 열 순서에 의존하는 경우 (쿼리 결과를 사용하여 열 위치에서 다른 데이터 구조를 채우므로) 원하는 순서대로 열을 명시 적으로 나열하십시오.

11

물론 SQL 문에서 열 순서를 변경할 수 있습니다. 그러나 테이블의 물리적 열 순서를 추상화하려면 뷰를 만들 수 있습니다. 즉

CREATE TABLE myTable(
    a int NULL,
    b varchar(50) NULL,
    c datetime NULL
);


CREATE VIEW vw_myTable
AS
SELECT c, a, b
  FROM myTable;

select * from myTable;
a  b  c
-  -  -

select * from vw_myTable
c  a  b
-  -  -

이로 인해 쿼리 시간이 변경됩니까?
blindguy

@blindguy없이 당신의 쿼리 시간 변경되지 않습니다
mevdiven

9

SQLServer Management Studio에서 :

도구-> 옵션-> 디자이너-> 테이블 및 데이터베이스 디자이너

  • '테이블 다시 생성이 필요한 변경 사항 저장 방지'를 선택 취소합니다.

그때:

  • 열 순서를 변경할 테이블을 마우스 오른쪽 버튼으로 클릭합니다.
  • '디자인'을 클릭합니다.
  • 열을 원하는 순서로 끕니다.
  • 마지막으로 저장을 클릭합니다.

SQLServer Management Studio는 테이블을 삭제하고 데이터를 사용하여 다시 만듭니다.


6

새 테이블을 만들고 모든 데이터를 복사하고 이전 테이블을 삭제 한 다음 새 테이블의 이름을 변경하여 이전 테이블을 대체하면됩니다.

또한 테이블에 새 열을 추가하고, 열 데이터별로 열을 복사하고, 이전 열을 삭제 한 다음, 이전 열과 일치하도록 새 열의 이름을 바꿀 수 있습니다. 아래의 간단한 예 : http://sqlfiddle.com/#!3/67af4/1

CREATE TABLE TestTable (
    Column1 INT,
    Column2 VARCHAR(255)
);
GO

insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO

select * from TestTable;
GO

ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO

update TestTable 
set Column1_NEW = Column1, 
    Column2_NEW = Column2;
GO

ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO

sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO

select * from TestTable;
GO

1
비슷한 일을하는 저장 프로 시저를 작성했습니다. 동적 SQL을 사용하여 테이블 재 구축을 자동화합니다. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

SQLServer Management Studio에서 :

Tools-> Options-> Designers->Table and Database Designers

을 선택 취소 Prevent saving changes that require table re-creation합니다.

이제 테이블을 재정렬 할 수 있습니다.


2

SQL 서버는 내부적으로 스크립트를 빌드합니다. 새로운 변경 사항으로 임시 테이블을 만들고 데이터를 복사하고 현재 테이블을 삭제 한 다음 임시 테이블에서 테이블 삽입을 다시 만듭니다. "Generate Change script"옵션 ssms 2014에서 찾을 수 있습니다. 이와 같은 스크립트. 에서 Here : SQL 쿼리를 사용하여 테이블에서 열 순서를 변경하는 방법

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_emps
    (
    id int NULL,
    ename varchar(20) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
     EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
        SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT' 
GO
COMMIT

1

테이블에 충분한 열이 있으면 이것을 시도 할 수 있습니다. 먼저 선호하는 열 순서로 새 테이블을 만듭니다.

    create table new as select column1,column2,column3,....columnN from table_name;

이제 drop 명령을 사용하여 테이블을 삭제하십시오.

    drop table table_name;

이제 새로 생성 된 테이블의 이름을 이전 테이블 이름으로 바꿉니다.

    rename new to table_name;

이제 테이블을 선택하면 이전에 선호하는대로 열이 재정렬됩니다.

    select * from table_name;

이는 새 테이블을 만들고 기존 테이블에서 새 테이블로 데이터를 복사하고 이전 테이블을 삭제하고 새 테이블의 이름을 바꾸는 것과 동일합니다. 엄밀히 말해서 이것은 테이블의 열 순서를 변경하지 않습니다. 이것은 이전 테이블에서 생성 / 복사하기 때문에 거대한 테이블의 경우 시간이 걸립니다. 마지막으로 제안 된 구문은 t-sql에서 작동하지 않습니다.
Jean-François

0

결국 MS SQL에서는이 작업을 수행 할 수 없습니다. 최근에 조회 테이블에서 읽는 저장 프로 시저를 사용하여 이동 (응용 프로그램 시작) 테이블을 만들었습니다. 이전에 수동으로 생성 한 다른 테이블 (동일한 스키마, 데이터 포함)을 결합한 뷰를 만들었을 때, 단순히 뷰에 대해 ''Select * UNION Select * '를 사용했기 때문에 실패했습니다. 동시에 저장 프로 시저를 통해 만든 것만 사용하면 성공합니다.

결론적으로, 컬럼의 순서에 의존하는 애플리케이션이 있다면 그것은 정말 좋은 프로그래밍이 아니며 확실히 미래에 문제를 일으킬 것입니다. 열은 어디에서나 자유롭게 '느껴 져야'하며 모든 데이터 프로세스 (INSERT, UPDATE, SELECT)에 사용되어야합니다.


0

다음 단계를 통해 달성 할 수 있습니다.

  1. 원래 테이블의 모든 외래 키와 기본 키를 제거하십시오.

  2. 원래 테이블의 이름을 바꿉니다.

  3. CTAS를 사용하여 원하는 순서대로 원래 테이블을 만듭니다.

  4. 이전 테이블을 삭제하십시오.

  5. 모든 제약 조건을 원래 테이블에 다시 적용


0

재정렬 할 열이 최근에 생성되어 비어있는 경우 열을 삭제하고 올바른 순서로 다시 추가 할 수 있습니다.

이것은 나에게 발생하여 새로운 기능을 추가하기 위해 데이터베이스를 수동으로 확장했으며 열을 놓쳤으며 추가했을 때 시퀀스가 ​​잘못되었습니다.

여기서 적절한 해결책을 찾지 못한 후 다음과 같은 종류의 명령을 사용하여 표를 수정했습니다.

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

참고 : 삭제하려는 열에 데이터가없는 경우에만이 작업을 수행하십시오.

사람들은 열 순서가 중요하지 않다고 말했습니다. SQL Server Management Studio "스크립트 생성"을 정기적으로 사용하여 데이터베이스 스키마의 텍스트 버전을 만듭니다. 이러한 스크립트 (git)의 버전을 효과적으로 제어하고 비교 (WinMerge)하려면 호환되는 데이터베이스의 출력이 동일해야하며 강조 표시된 차이점은 실제 데이터베이스 차이점입니다.

열 순서는 중요합니다. 그러나 모든 사람이 아닌 일부 사람들에게만!


0

특정 위치에 새 열을 추가하고 싶다고 가정합니다. 현재 열을 오른쪽으로 이동하여 새 열을 만들 수 있습니다.

+---+---+---+
| A | B | C |
+---+---+---+

영향을받는 모든 인덱스와 외래 키 참조를 제거합니다. 마지막 열과 동일한 데이터 유형을 가진 새 열을 추가하고 거기에 데이터를 복사합니다.

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

세 번째 열의 데이터 유형 을 이전 열과 동일한 유형으로 변경 하고 거기에 데이터를 복사하십시오.

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

그에 따라 열 이름을 바꾸고 제거 된 인덱스와 외래 키 참조를 다시 만듭니다.

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

두 번째 열의 데이터 유형을 변경합니다.

열 순서는 marc_s가 말한 것처럼 "외관 적"일 뿐이라는 것을 명심하십시오 .


-1

사용하다

SELECT * FROM TABLE1

테이블의 기본 열 순서를 표시합니다.

열 순서를 변경하려는 경우.

적절하게 표시 할 열 이름을 지정하십시오.

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

문제는 임시 주문에 관한 것이 아닙니다. 질문은 테이블을 변경하고 새 열을 추가 할 때 테이블 디자인 구조에 관한 것입니다.
vikas Chaturvedi

-1

인덱싱을 사용할 수 있습니다 .. 인덱싱 후 XXXX에서 *를 선택하면 결과는 인덱스에 따라야하지만 결과 집합 만 .. 테이블의 구조가 아닙니다.


-1

SQL 쿼리를 사용하여이를 변경할 수 있습니다. 다음은 컬럼의 순서를 변경하는 SQL 쿼리입니다.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;

이것이 SSMS에서와 같이 테이블이 삭제되고 다시 생성되는지 궁금합니다. 어느 쪽이든 프로덕션 DB에서 주사위를 굴리지는 않겠지 만이 방법은 흥미롭고 살펴볼 가치가있는 것 같습니다.
samis 2015

이 기능은 OP에서 지정한대로 SQL Server에서 작동하지 않습니다. 그랬 으면 좋겠어.

1
이것은 SQL Server가 아닌 MySQL 구문입니다.
Jon Schneider

-1

특정 열 순서를 갖기 위해서는 원하는 순서대로 열별로 열을 선택해야합니다. 선택 순서는 출력에서 ​​열의 순서를 지정합니다.


-1

다음 명령을 시도하십시오.

alter table students modify age int(5) first; 

이것은 나이의 위치를 ​​첫 번째 위치로 변경합니다.


이것은 MSSQL에서 유효한 SQL이 아닙니다. MySQL 또는 다른 언어 일 수 있지만 SQL Server 2005에는 해당되지 않습니다.
nsimeonov

-2

테이블 이름 변경 컬럼 이름 수정 int (5) 먼저; 열을 가져 와서 테이블 이름을 변경합니다. (tablename);


-3

예 : 테이블 상태에서 field_price 이후 field_priority의 위치를 ​​변경합니다.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;

2
이것은 SQL Server가 아닌 MySQL 구문입니다.
Jon Schneider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.