[SQL] 기존 컬럼에 ID를 추가
SQL기존 컬럼에 ID를 추가
나는 식별 컬럼에 테이블의 기본 키를 변경해야하고, 테이블에있는 행의 수는 이미있다.
나는 일에 그들에게있는 거 순차적 시작을 보장하기 위해 ID를 정리하는 스크립트를 가지고, 내 테스트 데이터베이스에서 잘 작동합니다.
신원 속성을 가지고 열을 변경할 수있는 SQL 명령은 무엇입니까?
해결법
-
==============================
1.당신은 정체성에 대한 기존의 열을 변경할 수 없습니다.
당신은 정체성에 대한 기존의 열을 변경할 수 없습니다.
당신은 두 가지 옵션이 있습니다,
다음은 새로 생성 된 ID 열에서 기존 데이터 값을 유지할 수 있습니다 1. (새로운 테이블)에 접근.
CREATE TABLE dbo.Tmp_Names ( Id int NOT NULL IDENTITY(1, 1), Name varchar(50) NULL ) ON [PRIMARY] go SET IDENTITY_INSERT dbo.Tmp_Names ON go IF EXISTS ( SELECT * FROM dbo.Names ) INSERT INTO dbo.Tmp_Names ( Id, Name ) SELECT Id, Name FROM dbo.Names TABLOCKX go SET IDENTITY_INSERT dbo.Tmp_Names OFF go DROP TABLE dbo.Names go Exec sp_rename 'Tmp_Names', 'Names'
당신은 새로 생성 된 ID 열에서 기존 데이터 값을 유지할 수 없습니다 2 (새 열)에 접근, 신원 열은 숫자의 순서를 개최한다.
Alter Table Names Add Id_new Int Identity(1, 1) Go Alter Table Names Drop Column ID Go Exec sp_rename 'Names.Id_new', 'ID', 'Column'
자세한 내용은 다음 Microsoft SQL 서버 포럼 게시물을 참조 :
정체성 (1,1) 컬럼을 변경하는 방법
-
==============================
2.SQL 2005 이상에서는 테이블의 데이터 페이지를 변경하지 않고이 문제를 해결하는 트릭이있다. 이 분 시간이 걸릴 수있는 모든 데이터 페이지를 만져 대형 테이블 중요하다. 트릭은 식별 컬럼은 기본 키입니다 간단한 "추가 / 삭제 / 이름 변경 열"솔루션을 여행 할 수있는 클러스터 또는 비 클러스터형 인덱스, 또는 다른 개는의 일부인 경우에도 작동합니다.
SQL 2005 이상에서는 테이블의 데이터 페이지를 변경하지 않고이 문제를 해결하는 트릭이있다. 이 분 시간이 걸릴 수있는 모든 데이터 페이지를 만져 대형 테이블 중요하다. 트릭은 식별 컬럼은 기본 키입니다 간단한 "추가 / 삭제 / 이름 변경 열"솔루션을 여행 할 수있는 클러스터 또는 비 클러스터형 인덱스, 또는 다른 개는의 일부인 경우에도 작동합니다.
여기에 트릭 : 당신은 당신이 동일한 테이블 스키마를 가진 IDENTITY있는 테이블을 대체 할 수있는 의미있는 데이터를 변경하지 않고 테이블의 스키마를 변경하는 SQL 서버의 ALTER TABLE ... SWITCH 문을 사용하지만 IDENTITY 열없이 할 수 있습니다. 같은 트릭은 기존 열 IDENTITY을 추가하기 위해 노력하고 있습니다.
일반적으로, ALTER TABLE은 ... SWITCH 효율적으로 비어있는 새 파티션으로 분할 된 테이블에 전체 파티션을 대체하는 데 사용됩니다. 그러나 그것은 또한 너무 비 분할 된 테이블에서 사용할 수 있습니다.
나는 5 초 이내에, 변환이 트릭을 사용했습니다 순서대로 비 IDENTITY (에 IDENTITY에서 25 억 행 테이블의 컬럼은 그 쿼리 계획보다 비 IDENTITY에 대한 일을 다 시간 쿼리를 실행합니다 다음 컬럼)을 5 초 미만에 다시 아이덴티티 설정을 복원.
여기 그것이 작동하는 방법의 코드 샘플입니다.
CREATE TABLE Test ( id int identity(1,1), somecolumn varchar(10) ); INSERT INTO Test VALUES ('Hello'); INSERT INTO Test VALUES ('World'); -- copy the table. use same schema, but no identity CREATE TABLE Test2 ( id int NOT NULL, somecolumn varchar(10) ); ALTER TABLE Test SWITCH TO Test2; -- drop the original (now empty) table DROP TABLE Test; -- rename new table to old table's name EXEC sp_rename 'Test2','Test'; -- update the identity seed DBCC CHECKIDENT('Test'); -- see same records SELECT * FROM Test;
이것은 분명히 다른 답변에서 솔루션보다 더 복잡하지만, 테이블이 큰 경우이 실제 생활을 절약 할 수 있습니다. 몇 가지주의 사항이 있습니다 :
위의 요구 사항을 자세히 TechNet의 좋은 기사가있다.
UPDATE - 에릭 우 그 아래에 댓글이 솔루션에 대한 중요한 정보를 추가했다. 하기 위해 여기를 복사하면 확인이 더 많은 관심을 가져옵니다
테이블이 적극적으로 새로운 행으로 확장되는 경우 (새 행을 IDENTITY를 추가하고 추가 사이의 다운 타임, 다음 대신 DBCC CHECKIDENT의 수동으로 새 테이블 스키마의 ID 시드 값을 설정할 수 있습니다 많은 경우에 당신이하지 않아도 의미 당신은 트랜잭션에서 ALTER TABLE ... SWITCH와 DBCC CHECKIDENT를 모두 포함 할 수 있습니다. 테이블, 예를 들어 IDENTITY (2435457, 1)에서 가장 규모가 큰 기존의 ID보다 크게 (또는 이것도 아니고 ... 테스트하지 않았습니다 이)하지만 쉽고 안전하게 될 것입니다 수동으로 시드 값을 설정처럼 보인다.
새로운 행이 테이블에 추가되고 있지 (또는 그들은 단지 매일 ETL 프로세스처럼, 때로는가 추가 될) 경우 DBCC CHECKIDENT는 벌금 그래서 분명히,이 경쟁 조건이 발생하지 않습니다.
-
==============================
3.당신은 IDENTITY 열이 될 수있는 열을 변경할 수 없습니다. 당신이 수행해야하는 것은 다음은 Get-이동에서 IDENTITY로 정의 된 새 열을 생성 된 열을 삭제, 이전의 이름에 새 이름을 바꿀 수 있습니다.
당신은 IDENTITY 열이 될 수있는 열을 변경할 수 없습니다. 당신이 수행해야하는 것은 다음은 Get-이동에서 IDENTITY로 정의 된 새 열을 생성 된 열을 삭제, 이전의 이름에 새 이름을 바꿀 수 있습니다.
ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1) ALTER TABLE (yourTable) DROP COLUMN OldColumnName EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN'
즙을 짜고 난 찌꺼기
-
==============================
4.여기에 설명 된 시원한 해결책이 있습니다 : SQL 서버 - 추가 또는 열에서 신원 속성을 제거
여기에 설명 된 시원한 해결책이 있습니다 : SQL 서버 - 추가 또는 열에서 신원 속성을 제거
짧은 수동으로 편집 SQL 관리자에서 테이블에서 그냥 변경 만들어집니다 스크립트를 보여 복사하고 나중에 사용, 신원, DO NOT 변경 사항 저장을 전환합니다.
그것은 (스크립트) 변경 테이블 관련 등 모든 외부 키, 인덱스를 포함하고 있기 때문에, 엄청난 시간을 절약 할 수 있습니다. 이 수동으로 ... 하나님이 금을 writting.
-
==============================
5.IDENTITY 대신 SEQUENCE를 사용하는 것이 좋습니다.
IDENTITY 대신 SEQUENCE를 사용하는 것이 좋습니다.
SQL 서버 2014 (I 낮은 버전 모르는)에서 당신은 순서를 사용하여, 간단하게이 작업을 수행 할 수 있습니다.
CREATE SEQUENCE sequence_name START WITH here_higher_number_than_max_existed_value_in_column INCREMENT BY 1; ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT NEXT VALUE FOR sequence_name FOR column_name
여기에서 : 컬럼의 디폴트 값으로 순서
-
==============================
6.간단한 설명
간단한 설명
sp_rename을을 사용하여 기존 열 이름 바꾸기
EXEC sp_rename을 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
이름 바꾸기에 대한 예 :
기존의 칼럼은 OldUserID 아이디로 변경되고
EXEC sp_RENAME 'AdminUsers.UserID' , 'OldUserID', 'COLUMN'
그런 다음 기본 키 및 ID 값으로 설정하는 ALTER 쿼리를 사용하여 새 열을 추가
ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1)
설정 차 키에 대한 예
새로운 생성 된 열 이름은 사용자 ID입니다
ALTER TABLE Users ADD UserID INT NOT NULL PRIMARY KEY IDENTITY(1,1)
다음 이름을 바꾼 열을 삭제
ALTER TABLE Table_Name DROP COLUMN Renamed_ColumnName
드롭에 대한 예는 열 이름
ALTER TABLE Users DROP COLUMN OldUserID
이제 우리는 테이블에 기존 열을 기본 키 및 ID를 추가하고 있습니다.
-
==============================
7.나는 개발자로서, 나는 DBA 권한을 얻을 수있는 DBA 하나없이 팀에 얻을 수 있었던 자바 개발자입니다. 나는 DBA를하지 않고 있으므로, 두 개의 데이터베이스 사이의 전체 스키마를 이동하는 임무했다, 나는 그것을 내가 관리자 권한을 가지고 있지 않았기 때문에 SQL Server 2008의 GUI를 사용할 수없는, 스크립트를 실행하여 작업을 수행했다.
나는 개발자로서, 나는 DBA 권한을 얻을 수있는 DBA 하나없이 팀에 얻을 수 있었던 자바 개발자입니다. 나는 DBA를하지 않고 있으므로, 두 개의 데이터베이스 사이의 전체 스키마를 이동하는 임무했다, 나는 그것을 내가 관리자 권한을 가지고 있지 않았기 때문에 SQL Server 2008의 GUI를 사용할 수없는, 스크립트를 실행하여 작업을 수행했다.
새로운 스키 마에서 저장 프로 시저를 실행할 때 모두가 문제없이 이동했다, 그러나, 나는 테이블의 ID 필드를 잃었 발견했다. 나는 두 번 테이블을 만든 스크립트를 확인하고 내가 스크립트를 실행했을 때, 그러나, SQL 서버를 거기에 도착하지 않았다이었다. 나는 그 전에이 같은 문제를 보았다고하는 DBA 나중에 들었다.
어떤 경우, SQL 서버 2008,이 내가이 해결 얻을하는 데 걸린 단계는 내가 누군가에게 도움이 될 것입니다 희망에 여기를 게시하도록하겠습니다 그래서 그들은했다. 이것은 내가 FK이 더 어려워 다른 테이블에 종속했다으로 내가 한 것입니다 :
나는 신원이 실제로 없어진 확인하고 테이블에 종속성을 보려면이 쿼리를 사용했다.
1) 테이블에 대한 통계를 찾기 :
exec sp_help 'dbo.table_name_old';
2) 중복, 동일한 새 테이블을 만들고, 그 전에 있었던 PK 필드에 신원 필드를 추가 예외입니다.
데이터 이동 3.) 안 신원.
SET IDENTITY_INSERT dbo.table_name ON
4) 데이터를 전송.
INSERT INTO dbo.table_name_new ( field1, field2, etc... ) SELECT field1, field2, etc... FROM dbo.table_name_old;
5) 데이터를 확인하다.
SELECT * FROM dbo.table_name_new
6) 신원을 다시 활성화합니다.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7) 이것은 내가) 어떤 테이블 (들 확인하기 위해 의존성과 같은 원래의 테이블 참조를 모든 FK 관계를 얻을 수있는 가장 좋은 스크립트입니다 나는 많은 걸쳐, 그래서이 골키퍼입니다 왔어요!
SELECT f.name AS ForeignKey, OBJECT_NAME(f.parent_object_id) AS TableName, COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id ORDER BY ReferenceTableName;
8)이 다음 단계 이전에, 관련된 모든 테이블에 대한 모든 PK와 FK 스크립트를 가지고 있는지 확인하십시오.
9) 당신은 2008 SQL 서버를 사용하여이 각 키와 스크립트를 마우스 오른쪽 단추로 클릭
10)이 구문을 사용하여 의존성 테이블 (들)로부터 FK (들)을 삭제 :
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11) 원래의 테이블을 삭제 :
DROP TABLE dbo.table_name_old;
13)이 다음 단계는 9 단계에서 SQL 서버 2008에서 만든 스크립트에 의존하고 있습니다.
새 테이블에 PK를 --add.
새 테이블에 FK를 --add.
종속성 테이블에 FK의 뒤를 --add.
14) 확인 모든 것이 정확하고 완전한입니다. 나는 테이블을보고 GUI를 사용했다.
15.) 원래 테이블의 이름으로 새 테이블의 이름을 바꿉니다.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
마지막으로, 모든 일!
-
==============================
8.나는 보통의 경우에서 알 수있는 바와 같이 우리는 ID 속성을 데 기본 키가있는 테이블을 만들 이름 바꾸기 그래서 또는 제약 규칙 열 구조의 유효성을 검사하기 때문에 할 수 없습니다 기본 키 제약 조건과 관련된 열을 삭제합니다. 이를 TTO 우리는 다음과 같은 방법으로 몇 가지 단계를 처리해야합니다 : 우리가 TABLENAME을 가정 해 봅시다 = '직원'과의 ColumnName = '직원 ID' '직원'테이블에 새 열 'EmployeeId_new'를 추가하십시오 ALTER TABLE 직원 ADD EmployeeId_new INT의 IDENTITY (1,1)
나는 보통의 경우에서 알 수있는 바와 같이 우리는 ID 속성을 데 기본 키가있는 테이블을 만들 이름 바꾸기 그래서 또는 제약 규칙 열 구조의 유효성을 검사하기 때문에 할 수 없습니다 기본 키 제약 조건과 관련된 열을 삭제합니다. 이를 TTO 우리는 다음과 같은 방법으로 몇 가지 단계를 처리해야합니다 : 우리가 TABLENAME을 가정 해 봅시다 = '직원'과의 ColumnName = '직원 ID' '직원'테이블에 새 열 'EmployeeId_new'를 추가하십시오 ALTER TABLE 직원 ADD EmployeeId_new INT의 IDENTITY (1,1)
이제 테이블 '직원 ID'와 '직원은'정체성에 대한 수정 8. 기존의 기본 키 제약 조건과 함께 규칙
-
==============================
9.디자인으로 켜거나 기존 컬럼에 대한 신원 기능을 해제하는 간단한 방법이 없습니다. 이 작업을 수행 할 수있는 깨끗한 방법은 새 열을 만들고 그것을 ID 열을 만들거나 새 테이블을 생성하고 데이터를 마이그레이션하는 것입니다.
디자인으로 켜거나 기존 컬럼에 대한 신원 기능을 해제하는 간단한 방법이 없습니다. 이 작업을 수행 할 수있는 깨끗한 방법은 새 열을 만들고 그것을 ID 열을 만들거나 새 테이블을 생성하고 데이터를 마이그레이션하는 것입니다.
우리는 SQL Server Management Studio의 새로운 임시 테이블이 만들어 열 "ID"에 ID 값, 제거하기 위해 사용하는 경우, 데이터를 임시 테이블로 이동, 기존의 테이블을 삭제하고 새 테이블 이름이 바뀝니다.
사용 관리 Studio는 변경 후 바로 디자이너 클릭하고 "변경 스크립트를 생성"을 선택합니다.
이 백그라운드에서 수행에서 무엇을 SQL 서버입니다 것을 볼 수 있습니다.
-
==============================
10.당신은 이전 테이블이 이전에 새 테이블의 이름을 변경 한 다음 당신은 다른 열을 추가 원래의 열을 삭제하고 새 열 이름을 바꾸거나 또는 새 테이블을 만들 필요가있는 데이터를 복사, 그런 식을하고 삭제할 수 없습니다 표
당신은 이전 테이블이 이전에 새 테이블의 이름을 변경 한 다음 당신은 다른 열을 추가 원래의 열을 삭제하고 새 열 이름을 바꾸거나 또는 새 테이블을 만들 필요가있는 데이터를 복사, 그런 식을하고 삭제할 수 없습니다 표
당신이 디자이너에서 SSMS를 사용하여 ON에 ID 속성을 설정하는 경우 여기에 SQL Server가 무대 뒤에서하는 일이다. 라는 이름의 테이블이있는 경우 당신이 만드는 경우에 따라서 [사용자]이 발생하는 사용자 ID와 정체성이다
BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 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 GO CREATE TABLE dbo.Tmp_User ( UserID int NOT NULL IDENTITY (1, 1), LastName varchar(50) NOT NULL, FirstName varchar(50) NOT NULL, MiddleInitial char(1) NULL ) ON [PRIMARY] GO SET IDENTITY_INSERT dbo.Tmp_User ON GO IF EXISTS(SELECT * FROM dbo.[User]) EXEC('INSERT INTO dbo.Tmp_User (UserID, LastName, FirstName, MiddleInitial) SELECT UserID, LastName, FirstName, MiddleInitialFROM dbo.[User] TABLOCKX') GO SET IDENTITY_INSERT dbo.Tmp_User OFF GO GO DROP TABLE dbo.[User] GO EXECUTE sp_rename N'dbo.Tmp_User', N'User', 'OBJECT' GO ALTER TABLE dbo.[User] ADD CONSTRAINT PK_User PRIMARY KEY CLUSTERED ( UserID ) ON [PRIMARY] GO COMMIT
거기에 비트 값을 설정하여이를 달성하기 위해 시스템 테이블을 해킹하는 방법입니다하지만이 지원되지 않습니다 내가 그것을 할 것이라고 말했다 가졌어요
-
==============================
11.슬프게도, 하나가 아니다; IDENTITY 속성은 테이블이 아닌 컬럼에 속한다.
슬프게도, 하나가 아니다; IDENTITY 속성은 테이블이 아닌 컬럼에 속한다.
더 쉬운 방법은 GUI에 그것을 할 것입니다, 그러나 이것은 옵션이 아닌 경우, 당신은 데이터를 복사 열을 떨어 뜨리고의 주위에 먼 길을 갈 수 있습니다, 정체성을 다시 추가, 데이터 등을 넣어.
타격별로 타격 계정 여기를 참조하십시오.
-
==============================
12.개체 탐색기에서 테이블 이름에 마우스 오른쪽 버튼을 클릭합니다. 당신은 몇 가지 옵션을 얻을 것이다. '디자인'을 클릭합니다. 새 탭이이 테이블에 대해 열립니다. 당신은 '열 속성'여기 신원 제약 조건을 추가 할 수 있습니다.
개체 탐색기에서 테이블 이름에 마우스 오른쪽 버튼을 클릭합니다. 당신은 몇 가지 옵션을 얻을 것이다. '디자인'을 클릭합니다. 새 탭이이 테이블에 대해 열립니다. 당신은 '열 속성'여기 신원 제약 조건을 추가 할 수 있습니다.
-
==============================
13.열에 대한 신원 속성을 수정하려면 :
열에 대한 신원 속성을 수정하려면 :
그게, 그리고 그것은 나를 위해 일한
-
==============================
14.당신은 비주얼 스튜디오를 사용하는 일이면 2017+
당신은 비주얼 스튜디오를 사용하는 일이면 2017+
이것은 모든 당신을 위해 그것을 할 것입니다.
-
==============================
15.원래 포스터가 실제로 IDENTITY 열 (다른 두 가지) 다음이와 t-SQL을 통해 수행 될 수로 열을 필요로하지 않았다 실제로 테이블의 PRIMARY KEY로 기존 열을 설정하고 싶은 경우 :
원래 포스터가 실제로 IDENTITY 열 (다른 두 가지) 다음이와 t-SQL을 통해 수행 될 수로 열을 필요로하지 않았다 실제로 테이블의 PRIMARY KEY로 기존 열을 설정하고 싶은 경우 :
ALTER TABLE [YourTableName] ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey])
기본 키 옵션 후 열 이름 주위에 괄호를합니다.
이 게시물은 오래되어 요청자 필요에 대해 내가 가정을하고 있지만, 내가 하나를 이끌 수있는 대화가 기존의 열이을로 설정 될 수 있다고 생각하는 생각으로이 추가 정보는이 스레드가 발생한 사용자에게 도움이 될 수있는 느낌 잘못된 것이 먼저 새 열로 추가없이 기본 키.
-
==============================
16.나의 현재의 상태에 따라, 나는이 방법을 따르십시오. 나는 스크립트를 통해 삽입 된 데이터 후 기본 테이블에 정체성을 부여하고 싶습니다.
나의 현재의 상태에 따라, 나는이 방법을 따르십시오. 나는 스크립트를 통해 삽입 된 데이터 후 기본 테이블에 정체성을 부여하고 싶습니다.
나는 항상 1부터 시작하므로, 신원을 추가 원하는대로 내가 원하는 것을 기록 카운트 종료합니다.
--first drop column and add with identity ALTER TABLE dbo.tblProductPriceList drop column ID ALTER TABLE dbo.tblProductPriceList add ID INT IDENTITY(1,1) --then add primary key to that column (exist option you can ignore) IF NOT EXISTS (SELECT * FROM sys.key_constraints WHERE object_id = OBJECT_ID(N'[dbo].[PK_tblProductPriceList]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblProductPriceList]')) ALTER TABLE [tblProductPriceList] ADD PRIMARY KEY (id) GO
이것은 정체성과 같은 기본 키 열을 만듭니다
나는이 링크를 사용 : https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
기존 테이블에 기본 키를 추가
-
==============================
17.난 당신이 TSQL을 사용하여 ID 열로 기존 열을 변경할 수 있다고 생각하지 않습니다. 그러나 엔터프라이즈 관리자 디자인보기를 통해 그것을 할 수 있습니다.
난 당신이 TSQL을 사용하여 ID 열로 기존 열을 변경할 수 있다고 생각하지 않습니다. 그러나 엔터프라이즈 관리자 디자인보기를 통해 그것을 할 수 있습니다.
또는 당신은 당신의 새로운 열 이름을 변경, 이전 열을 삭제, ID 열로 새 행을 만들 수 있습니다.
ALTER TABLE FooTable ADD BarColumn INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED
-
==============================
18.기본적으로 4 개의 논리 단계가 있습니다.
기본적으로 4 개의 논리 단계가 있습니다.
등 여러 서버에 작업 같은 좀 더 복잡한이있을 수 있습니다
(SSMS & T-SQL을 사용하여) 단계의 다음 문서를 참조하십시오. 이 단계는 T-SQL에 덜 그립 초보자를위한 것입니다.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
-
==============================
19.신원 세트가없는 기본 키 = BIGINT 모든 테이블에 대한 스크립트를 생성; 이 각 테이블에 생성 된 스크립트의 목록을 반환합니다;
신원 세트가없는 기본 키 = BIGINT 모든 테이블에 대한 스크립트를 생성; 이 각 테이블에 생성 된 스크립트의 목록을 반환합니다;
SET NOCOUNT ON; declare @sql table(s varchar(max), id int identity) DECLARE @table_name nvarchar(max), @table_schema nvarchar(max); DECLARE vendor_cursor CURSOR FOR SELECT t.name, s.name FROM sys.schemas AS s INNER JOIN sys.tables AS t ON s.[schema_id] = t.[schema_id] WHERE EXISTS ( SELECT [c].[name] from sys.columns [c] join sys.types [y] on [y].system_type_id = [c].system_type_id where [c].[object_id] = [t].[object_id] and [y].name = 'bigint' and [c].[column_id] = 1 ) and NOT EXISTS ( SELECT 1 FROM sys.identity_columns WHERE [object_id] = t.[object_id] ) and exists ( select 1 from sys.indexes as [i] inner join sys.index_columns as [ic] ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id where object_name([ic].[object_id]) = [t].[name] ) OPEN vendor_cursor FETCH NEXT FROM vendor_cursor INTO @table_name, @table_schema WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM @sql declare @pkname varchar(100), @pkcol nvarchar(100) SELECT top 1 @pkname = i.name, @pkcol = COL_NAME(ic.OBJECT_ID,ic.column_id) FROM sys.indexes AS [i] INNER JOIN sys.index_columns AS [ic] ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id WHERE i.is_primary_key = 1 and OBJECT_NAME(ic.OBJECT_ID) = @table_name declare @q nvarchar(max) = 'SELECT '+@pkcol+' FROM ['+@table_schema+'].['+@table_name+'] ORDER BY '+@pkcol+' DESC' DECLARE @ident_seed nvarchar(max) -- Change this to the datatype that you are after SET @q = REPLACE(@q, 'SELECT', 'SELECT TOP 1 @output = ') EXEC sp_executeSql @q, N'@output bigint OUTPUT', @ident_seed OUTPUT insert into @sql(s) values ('BEGIN TRANSACTION') insert into @sql(s) values ('BEGIN TRY') -- create statement insert into @sql(s) values ('create table ['+@table_schema+'].[' + @table_name + '_Temp] (') -- column list insert into @sql(s) select ' ['+[c].[name]+'] ' + y.name + (case when [y].[name] like '%varchar' then coalesce('('+(case when ([c].[max_length] < 0 or [c].[max_length] >= 1024) then 'max' else cast([c].max_length as varchar) end)+')','') else '' end) + ' ' + case when [c].name = @pkcol then 'IDENTITY(' +COALESCE(@ident_seed, '1')+',1)' else '' end + ' ' + ( case when c.is_nullable = 0 then 'NOT ' else '' end ) + 'NULL ' + coalesce('DEFAULT ('+( REPLACE( REPLACE( LTrim( RTrim( REPLACE( REPLACE( REPLACE( REPLACE( LTrim( RTrim( REPLACE( REPLACE( object_definition([c].default_object_id) ,' ','~') ,')',' ') ) ) ,' ','*') ,'~',' ') ,' ','~') ,'(',' ') ) ) ,' ','*') ,'~',' ') ) + case when object_definition([c].default_object_id) like '%get%date%' then '()' else '' end + ')','') + ',' from sys.columns c JOIN sys.types y ON y.system_type_id = c.system_type_id where OBJECT_NAME(c.[object_id]) = @table_name and [y].name != 'sysname' order by [c].column_id update @sql set s=left(s,len(s)-1) where id=@@identity -- closing bracket insert into @sql(s) values( ')' ) insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] ON') declare @cols nvarchar(max) SELECT @cols = STUFF( ( select ',['+c.name+']' from sys.columns c JOIN sys.types y ON y.system_type_id = c.system_type_id where c.[object_id] = OBJECT_ID(@table_name) and [y].name != 'sysname' and [y].name != 'timestamp' order by [c].column_id FOR XML PATH ('') ) , 1, 1, '') insert into @sql(s) values( 'IF EXISTS(SELECT * FROM ['+@table_schema+'].['+@table_name+'])') insert into @sql(s) values( 'EXEC(''INSERT INTO ['+@table_schema+'].['+@table_name+'_Temp] ('+@cols+')') insert into @sql(s) values( 'SELECT '+@cols+' FROM ['+@table_schema+'].['+@table_name+']'')') insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] OFF') insert into @sql(s) values( 'DROP TABLE ['+@table_schema+'].['+@table_name+']') insert into @sql(s) values( 'EXECUTE sp_rename N''['+@table_schema+'].['+@table_name+'_Temp]'', N'''+@table_name+''', ''OBJECT''') if ( @pkname is not null ) begin insert into @sql(s) values('ALTER TABLE ['+@table_schema+'].['+@table_name+'] ADD CONSTRAINT ['+@pkname+'] PRIMARY KEY CLUSTERED (') insert into @sql(s) select ' ['+COLUMN_NAME+'] ASC,' from information_schema.key_column_usage where constraint_name = @pkname GROUP BY COLUMN_NAME, ordinal_position order by ordinal_position -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity insert into @sql(s) values (' )') end insert into @sql(s) values ('--Run your Statements') insert into @sql(s) values ('COMMIT TRANSACTION') insert into @sql(s) values ('END TRY') insert into @sql(s) values ('BEGIN CATCH') insert into @sql(s) values (' ROLLBACK TRANSACTION') insert into @sql(s) values (' DECLARE @Msg NVARCHAR(MAX) ') insert into @sql(s) values (' SELECT @Msg=ERROR_MESSAGE() ') insert into @sql(s) values (' RAISERROR(''Error Occured: %s'', 20, 101,@msg) WITH LOG') insert into @sql(s) values ('END CATCH') declare @fqry nvarchar(max) -- result! SELECT @fqry = (select char(10) + s from @sql order by id FOR XML PATH ('')) SELECT @table_name as [Table_Name], @fqry as [Generated_Query] PRINT 'Table: '+@table_name EXEC sp_executeSql @fqry FETCH NEXT FROM vendor_cursor INTO @table_name, @table_schema END CLOSE vendor_cursor; DEALLOCATE vendor_cursor;
from https://stackoverflow.com/questions/1049210/adding-an-identity-to-an-existing-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 테이블에서 중복 값 찾기 (0) | 2020.03.07 |
---|---|
[SQL] 측면과 PostgreSQL에서 하위 쿼리의 차이점은 무엇입니까? (0) | 2020.03.07 |
[SQL] SQL은 조인 절에 where 절 대를 (0) | 2020.03.07 |
[SQL] UNION과 UNION ALL의 차이점은 무엇입니까? (0) | 2020.03.07 |
[SQL] 어떻게 SQL에 가입하기로 UPDATE 문을 할 수 있습니까? (0) | 2020.03.07 |