Microsoft SQL Server의 특정 순서 위치에 새 테이블 열 추가
Microsoft SQL Server에서 특정 순서 위치의 테이블에 열을 추가할 수 있습니까?
예를 들어 테이블에는 항상 각 테이블 정의의 "끝"에 CreatedOn, CreatedBy, LastModifiedOn, LastModifiedBy 열이 있습니다.새 열이 이 열 위에 SSMS로 표시되기를 원합니다.
데이터베이스 변경사항을 모두 스크립팅하는 경우 테이블 끝에 있는 이 순서를 유지할 수 있는 방법이 있습니까?
참고로, 나는 이것이 행해져야 하는지에 대해 불꽃 전쟁을 일으키려는 것이 아닙니다.빠르게 퇴화하는 스레드에 대해 읽고 싶다면 다음과 같은 좋은 예가 있습니다.
http://www.developersdex.com/sql/message.asp?p=581&r=5014513
원본 테이블의 스키마를 미러링하지만 원하는 열 순서를 사용하는 임시 테이블을 만든 다음 원본의 내용을 임시로 복사해야 합니다.원본을 삭제하고 임시 이름을 변경합니다.
이것이 SQL Management Studio가 백그라운드에서 수행하는 작업입니다.
스키마 동기화 도구를 사용하여 이러한 스크립트를 자동으로 생성할 수 있습니다.
SQL Server Management Studio로 이동하여 기존 테이블을 "설계"합니다.가운데에 열을 삽입하고 빈 영역을 마우스 오른쪽 버튼으로 클릭한 다음 변경 스크립트 생성...을 선택합니다.
이제 그것이 만드는 스크립트를 보세요.기본적으로 적절한 열 순서로 임시 테이블을 만들고, 원래 테이블의 데이터를 삽입하고, 원래 테이블을 삭제하고, 임시 테이블의 이름을 변경합니다.이것이 아마도 당신이 해야 할 일일 것입니다.
변경 스크립트를 만들 수 있도록 하려면 이 옵션의 선택을 취소해야 할 수도 있습니다.
정답은 '예'입니다. 기술적으로는 가능하지만 그렇게 하면 머리가 아프고 실행하고 설정하는 데 시간이 오래 걸립니다.
하나: 만들기/복사/드롭/이름 바꾸기
다음은 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 보기를 사용하면 테이블 열 변경에 영향을 받지 않고 원하는 순서를 사용할 수 있습니다.
저는 SSMS 18을 사용하고 있습니다.간단한 방법으로 했습니다.
- 테이블의 열린 설계
- 필요한 열을 끌어서 배치
- 그리고 KM(스레드에서 두 번째)의 답변에 따라 위의 이미지를 참조하여 변경 스크립트를 만들 수 있는 옵션을 선택 취소합니다.
- 변경 내용을 저장합니다.
- 됐습니다. 지금 자리를 확인하세요.
TFS 2013은 자동으로 이 기능을 제공합니다.
원하는 대로 새 열을 테이블에 추가한 다음 TFS에 변경 내용을 커밋합니다.여기서 Visual Studio에서 테이블의 sql 파일을 열고 T-SQL CREATE 스크립트의 열 순서를 수동으로 이동할 수 있습니다.그런 다음 [도구] > [SQL 서버] > [새 스키마 비교]에 있는 VS의 스키마 비교 도구를 사용하여 대상 데이터베이스를 업데이트할 수 있습니다.변경사항을 원본으로 하고 업데이트할 데이터베이스를 대상으로 데이터베이스 프로젝트를 선택합니다.비교하고 테이블의 스크립트를 선택한 후 업데이트합니다.VS가 삭제되고 자동으로 추가됩니다.당신의 모든 데이터는 안전할 것이고 인덱스도 안전할 것입니다.
제가 생각하기에 간단한 것은 ALTER TABLE1 ADD 열을 추가하는 것입니다.그런 다음 select like에서 tmp_table1과 같은 tmp 테이블을 만들고 tmp_table1을 table1로 삭제하고 tmp_table1의 이름을 table1로 변경합니다.누군가에게 도움이 되길 바랍니다.
모든 열을 임시 테이블로 선택하고 원하는 새 열로 새 테이블을 만듭니다.그런 다음 이전 테이블을 삭제하고 임시 테이블에서 모든 열을 선택한 다음 정렬된 열을 새 테이블에 삽입합니다.데이터가 손실되지 않습니다.
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)
더럽고 단순합니다.
테이블을 csv로 내보냅니다.
원하는 위치에 새 데이터를 삽입합니다.
드롭 테이블.
원하는 열 사양으로 새 테이블을 만듭니다.
열을 csv에서 새 테이블로 로드합니다.
스레드가 아직 활성화되어 있는지 확신할 수 없습니다.MySQL 데이터베이스와 동일한 쿼리를 수행하고 있었습니다.표를 마우스 오른쪽 버튼으로 클릭하고 'ALTER'를 선택하면 아래 코드가 자동으로 생성됩니다.sakila db에서 샘플을 제공했고 그것은 작동했습니다.새 열을 배치할 열을 찾고 'AFTER' 키워드를 사용하십시오.
ALTER TABLE `sakila`.`actor`
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`;
언급URL : https://stackoverflow.com/questions/769828/add-a-new-table-column-to-specific-ordinal-position-in-microsoft-sql-server
'programing' 카테고리의 다른 글
통합 테스트를 위해 스프링 부트 @EnableAsync 사용 안 함 (0) | 2023.07.06 |
---|---|
iphone: 충돌 보고서에서 .dSYM 파일이 있는 위치 (0) | 2023.07.06 |
dplyr 패키지를 조건부 돌연변이에 사용할 수 있습니까? (0) | 2023.07.06 |
WordPress다른 언어로 클릭할 때 로고 이미지 변경 (0) | 2023.07.06 |
SSIS - 잠재적인 데이터 손실로 인해 값을 변환할 수 없습니다. (0) | 2023.07.06 |