문제

Microsoft SQL Server의 특정 서수 위치에있는 테이블에 열을 추가 할 수 있습니까?

예를 들어, 우리의 테이블은 항상 각 테이블 정의의 "종료"에있는 LastModifiedBy 열을 만들었습니까? 새 열 이이 열 위의 SSM에 표시되기를 바랍니다.

모든 데이터베이스 변경 사항을 스크립팅하는 경우 테이블 끝 에서이 주문을 보존 할 수있는 방법이 있습니까?

참고로, 나는 이것이해야한다면 불꽃 전쟁을 시도하지 않습니다. 빠르게 변성하는 실에 대해 읽고 싶다면 여기에 좋은 것이 있습니다.

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

도움이 되었습니까?

해결책

원래 테이블의 스키마를 반영하지만 원하는 열 순서를 사용하여 원본의 내용을 온도에 복사하는 온도 테이블을 만들어야합니다. 원본을 삭제하고 임시 이름을 바꿉니다.

이것이 SQL Management Studio가 무대 뒤에서하는 일입니다.

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

다른 팁

SQL Server Management Studio로 이동하여 기존 테이블을 "디자인"하십시오. 중간에 열을 삽입하고 빈 구역을 마우스 오른쪽 버튼으로 클릭하고 선택하십시오. 변경 스크립트 생성 ...

이제 생성하는 스크립트를보십시오. 기본적으로 적절한 열 순서가있는 온도 테이블을 작성하고 원래 테이블에서 데이터를 삽입하고 원래 테이블을 떨어 뜨린 후 온도 테이블의 이름을 바꿉니다. 이것은 아마도 당신이해야 할 일일 것입니다.

enter image description here

변경 스크립트 생성을 위해이 옵션을 선택 취소해야 할 수도 있습니다.

enter image description here

대답은 그렇습니다. 기술적으로는 가능하지만 두통을 겪고 실행하고 설정하는 데 시간이 오래 걸릴 것입니다.

하나 : 생성/복사/드롭/이름을 바꿉니다

이것은 실제로 그래픽 인터페이스에서 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

둘 : 열 / 업데이트 / 삭제 열 / 이름 변경 추가

이 방법에는 기본적으로 새 열의 '오른쪽'에 추가하려는 기존 열의 사본을 작성하고 데이터를 새 열로 전송 한 다음 원본을 삭제하고 새 열 이름을 바꾸는 것이 포함됩니다. 이것은 당신이 가지고있는 모든 색인이나 제약 조건으로 혼란스러워합니다. 기술적으로 가능하지만 개발과 실행 측면에서 시간이 많이 걸립니다.

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

셋째 : 그것과 함께 산다

이것은 내 질서의 감각을 강력하게 불쾌하게 만듭니다. 그러나 때로는, 그것은 단지 개편 할 가치가 없습니다.

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

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

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

어쨌든 테이블에 새 열을 추가 한 다음 TFS에 변경 사항을 커밋하십시오. 여기에서 Visual Studio에서 테이블의 SQL 파일을 열고 T-SQL 작성 스크립트에서 열 순서를 수동으로 이동할 수 있습니다. 그런 다음 도구> SQL Server> New Schema 비교에서 찾은 VS의 스키마 비교 도구를 사용하여 대상 데이터베이스를 업데이트 할 수 있습니다. 변경 사항이 소스로서 데이터베이스 프로젝트를 선택하고 대상으로 업데이트하려는 데이터베이스를 선택하십시오. 비교하고 테이블의 스크립트를 선택하고 업데이트하십시오. vs는 자동으로 떨어지고 추가합니다. 모든 데이터가 안전하고 색인도 있습니다.

더럽고 단순합니다.
CSV로 수출 테이블.
원하는 위치에 새 데이터를 삽입하십시오.
드롭 테이블.
원하는 열 사양으로 새 테이블을 만듭니다.
CSV에서 새 테이블로 열을로드합니다.

내가 간단하다고 생각하는 것은 열 Alter Table 1을 추가하는 것입니다.SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; 그런 다음 표 1을 삭제하고 tmp_table1을 표 1로 바꾸십시오. 나는 그것이 누군가를 도울 수 있기를 바랍니다

스레드가 여전히 활성화되어 있는지 확실하지 않습니다. MySQL 데이터베이스와 동일한 쿼리를 가지고있었습니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 'Alter'자동 선택하면 아래 코드가 생성되었습니다. Sakila DB에서 제공 한 샘플이 작동했습니다. 새 열을 배치하고 '키워드를 사용한 후 사용하려는 열을 찾으십시오.

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

온도 테이블의 모든 열을 선택하고 새 테이블을 사용하여 새 테이블을 만듭니다. 기존 테이블을 떨어 뜨려 원하는 열을 선택하고 온도 테이블에서 열을 선택하고 재정렬 열로 새로 삽입하십시오. 데이터 손실없이

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top