답변:
당신은 할 수 없습니다. 열 순서는 우리 인간이 신경 쓰는 "외관 적"일뿐입니다. SQL Server에 대해서는 거의 항상 절대적으로 관련이 없습니다.
열 순서를 변경할 때 SQL Server Management Studio가 백그라운드에서 수행하는 작업은 새 CREATE TABLE
명령으로 처음부터 테이블을 다시 만들고 이전 테이블의 데이터를 복사 한 다음 삭제하는 것입니다.
열 순서를 정의하는 SQL 명령이 없습니다.
INSERT
명시 적으로 열을 어쨌든 지정하지 않고!
'기본'순서에 *를 사용하는 대신 반환 할 순서대로 필드를 명시 적으로 나열해야합니다.
원래 검색어 :
select * from foobar
보고
foo bar
--- ---
1 2
지금 쓰다
select bar, foo from foobar
bar foo
--- ---
2 1
http://msdn.microsoft.com/en-us/library/aa337556.aspx 에 따르면
이 작업은 Transact-SQL 문을 사용하여 지원되지 않습니다.
글쎄, 그것은 komma8.komma1의 답변대로 create
/ 복사 / drop
/ 이름 바꾸기를 사용하여 수행 할 수 있습니다.
또는 SQL Server Management Studio를 사용할 수 있습니다.
- 에서 개체 탐색기 , 당신이 순서를 원하는 열이있는 테이블을 마우스 오른쪽 단추로 클릭 디자인 (이전 버전에 수정을. 2005 SP1 또는)
- 재정렬 할 열 이름 왼쪽에있는 상자를 선택합니다. (키보드에서 [shift] 또는 [ctrl] 키를 눌러 여러 열을 선택할 수 있습니다.)
- 열을 테이블 내의 다른 위치로 끕니다.
그런 다음 저장을 클릭하십시오. 이 방법은 실제로 테이블을 삭제하고 다시 생성하므로 일부 오류가 발생할 수 있습니다.
경우 변경 내용 추적 옵션은 데이터베이스와 테이블을 사용,이 방법을 사용하면 안됩니다.
비활성화 된 경우 도구 메뉴> 옵션> 디자이너에서 테이블 다시 생성이 필요한 변경 사항 저장 방지 옵션을 지워야합니다. 그렇지 않으면 "변경 사항 저장이 허용되지 않음" 오류가 발생합니다.
기본 및 외래 키 생성 중에 문제가 발생할 수도 있습니다.
위의 오류가 발생하면 저장에 실패하여 원래 열 순서가 유지됩니다.
This task cannot be performed using Transact-SQL statements.
문서의 " " 문구 가 잘못되었습니다. 저자를 설명하고 " This task is not supported using Transact-SQL statements.
" 로 변경해달라고 요청했습니다 . 약 하루 전에 저자가 동의하고 문서가 수정되었습니다. GitHub에서 논의한 내용을 따를 수 있습니다 .
이것은 질의의 결과로 레코드를 정렬하는 질문과 유사하며 일반적으로 공식적으로 정답을 좋아하는 사람은 없습니다 ;-)
그래서 여기에 간다 :
select *
는 열이 특정 순서로 반환되도록 강제하지 않습니다.create table' or in the
alter table add`문에서물론 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
- - -
새 테이블을 만들고 모든 데이터를 복사하고 이전 테이블을 삭제 한 다음 새 테이블의 이름을 변경하여 이전 테이블을 대체하면됩니다.
또한 테이블에 새 열을 추가하고, 열 데이터별로 열을 복사하고, 이전 열을 삭제 한 다음, 이전 열과 일치하도록 새 열의 이름을 바꿀 수 있습니다. 아래의 간단한 예 : 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
SQLServer Management Studio에서 :
Tools
-> Options
-> Designers
->Table and Database Designers
을 선택 취소 Prevent saving changes that require table re-creation
합니다.
이제 테이블을 재정렬 할 수 있습니다.
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
테이블에 충분한 열이 있으면 이것을 시도 할 수 있습니다. 먼저 선호하는 열 순서로 새 테이블을 만듭니다.
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;
결국 MS SQL에서는이 작업을 수행 할 수 없습니다. 최근에 조회 테이블에서 읽는 저장 프로 시저를 사용하여 이동 (응용 프로그램 시작) 테이블을 만들었습니다. 이전에 수동으로 생성 한 다른 테이블 (동일한 스키마, 데이터 포함)을 결합한 뷰를 만들었을 때, 단순히 뷰에 대해 ''Select * UNION Select * '를 사용했기 때문에 실패했습니다. 동시에 저장 프로 시저를 통해 만든 것만 사용하면 성공합니다.
결론적으로, 컬럼의 순서에 의존하는 애플리케이션이 있다면 그것은 정말 좋은 프로그래밍이 아니며 확실히 미래에 문제를 일으킬 것입니다. 열은 어디에서나 자유롭게 '느껴 져야'하며 모든 데이터 프로세스 (INSERT, UPDATE, SELECT)에 사용되어야합니다.
재정렬 할 열이 최근에 생성되어 비어있는 경우 열을 삭제하고 올바른 순서로 다시 추가 할 수 있습니다.
이것은 나에게 발생하여 새로운 기능을 추가하기 위해 데이터베이스를 수동으로 확장했으며 열을 놓쳤으며 추가했을 때 시퀀스가 잘못되었습니다.
여기서 적절한 해결책을 찾지 못한 후 다음과 같은 종류의 명령을 사용하여 표를 수정했습니다.
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
참고 : 삭제하려는 열에 데이터가없는 경우에만이 작업을 수행하십시오.
사람들은 열 순서가 중요하지 않다고 말했습니다. SQL Server Management Studio "스크립트 생성"을 정기적으로 사용하여 데이터베이스 스키마의 텍스트 버전을 만듭니다. 이러한 스크립트 (git)의 버전을 효과적으로 제어하고 비교 (WinMerge)하려면 호환되는 데이터베이스의 출력이 동일해야하며 강조 표시된 차이점은 실제 데이터베이스 차이점입니다.
열 순서는 중요합니다. 그러나 모든 사람이 아닌 일부 사람들에게만!
특정 위치에 새 열을 추가하고 싶다고 가정합니다. 현재 열을 오른쪽으로 이동하여 새 열을 만들 수 있습니다.
+---+---+---+
| A | B | C |
+---+---+---+
영향을받는 모든 인덱스와 외래 키 참조를 제거합니다. 마지막 열과 동일한 데이터 유형을 가진 새 열을 추가하고 거기에 데이터를 복사합니다.
+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
|___^
세 번째 열의 데이터 유형 을 이전 열과 동일한 유형으로 변경 하고 거기에 데이터를 복사하십시오.
+---+---+---+---+
| A | B | B | C |
+---+---+---+---+
|___^
그에 따라 열 이름을 바꾸고 제거 된 인덱스와 외래 키 참조를 다시 만듭니다.
+---+---+---+---+
| A | D | B | C |
+---+---+---+---+
두 번째 열의 데이터 유형을 변경합니다.
사용하다
SELECT * FROM TABLE1
테이블의 기본 열 순서를 표시합니다.
열 순서를 변경하려는 경우.
적절하게 표시 할 열 이름을 지정하십시오.
SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
SQL 쿼리를 사용하여이를 변경할 수 있습니다. 다음은 컬럼의 순서를 변경하는 SQL 쿼리입니다.
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
특정 열 순서를 갖기 위해서는 원하는 순서대로 열별로 열을 선택해야합니다. 선택 순서는 출력에서 열의 순서를 지정합니다.
다음 명령을 시도하십시오.
alter table students modify age int(5) first;
이것은 나이의 위치를 첫 번째 위치로 변경합니다.
테이블 이름 변경 컬럼 이름 수정 int (5) 먼저; 열을 가져 와서 테이블 이름을 변경합니다. (tablename);
예 : 테이블 상태에서 field_price 이후 field_priority의 위치를 변경합니다.
ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;