การเพิ่มเอกลักษณ์ให้กับคอลัมน์ที่มีอยู่


445

ฉันต้องเปลี่ยนคีย์หลักของตารางเป็นคอลัมน์ข้อมูลประจำตัวและมีจำนวนแถวในตารางอยู่แล้ว

ฉันมีสคริปต์เพื่อล้าง ID เพื่อให้แน่ใจว่าพวกเขากำลังเรียงลำดับเริ่มต้นที่ 1 ทำงานได้ดีบนฐานข้อมูลทดสอบของฉัน

คำสั่ง SQL ในการแก้ไขคอลัมน์เพื่อให้มีคุณสมบัติตัวตนคืออะไร?

คำตอบ:


482

คุณไม่สามารถแก้ไขคอลัมน์ที่มีอยู่เพื่อระบุตัวตน

คุณมี 2 ตัวเลือก

  1. สร้างตารางใหม่ด้วยข้อมูลประจำตัว & วางตารางที่มีอยู่

  2. สร้างคอลัมน์ใหม่ด้วยข้อมูลประจำตัว & วางคอลัมน์ที่มีอยู่

วิธีที่ 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'

วิธีที่ 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 Server ต่อไปนี้สำหรับรายละเอียดเพิ่มเติม:

วิธีเปลี่ยนคอลัมน์เป็นข้อมูลประจำตัว (1,1)


49
หากข้อมูลตารางมีขนาดเล็กตัวเลือกนี้จะทำงานได้อย่างน่าเกรงขาม หากตารางมีขนาดใหญ่มีอีกตัวเลือกหนึ่งที่ฉันชอบ: ใช้ ALTER TABLE ... SWITCH เพื่อแทนที่สคีมาของตารางด้วยเวอร์ชันอื่นด้วยคอลัมน์ตัวตน แต่สคีมาเหมือนกัน ข้อดีของวิธี ALTER TABLE .... SWITCH คือการทำให้เสร็จสมบูรณ์อย่างรวดเร็ว (ต่ำกว่า 5 วินาทีสำหรับตารางหนึ่งพันล้านแถว) เนื่องจากไม่จำเป็นต้องคัดลอกหรือเปลี่ยนแปลงข้อมูลตาราง มีข้อแม้และข้อ จำกัด ว่า ดูคำตอบของฉันด้านล่างสำหรับรายละเอียด
Justin Grant

7
@ จัสติน Grat: ทางเลือกที่น่าสนใจมากและเป็นหนึ่งที่ฉันไม่ได้พิจารณา! เหตุผลที่ใช้ได้เนื่องจาก IDENTITY เป็นคุณสมบัติคอลัมน์และไม่ใช่ชนิดข้อมูลดังนั้นวิธี SWITCH จะตรวจสอบ schema ระหว่างสองตาราง (เก่าและใหม่) ว่าสามารถระบุตัวตนได้โดยไม่คำนึงถึงความแตกต่างของ IDENTITY ขอบคุณสำหรับการแบ่งปัน!
John Sansom

หากคุณไม่มีข้อมูลมากนักคุณสามารถสร้าง "สร้างตาราง" ได้ด้วยการสร้างสคริปต์จาก SSMS คลิกขวาที่ตาราง> Scrip Table เป็น> Create TABLE to> (ตัวแก้ไขคิวรีใหม่?) จากนั้นวางและภายในสคริปต์นั้นคุณสามารถเพิ่มIDENTITY(1, 1)ส่วนด้วยคอลัมน์คีย์หลัก
goamn

ท่านสามารถใช้ SSMS เพื่อบังคับใช้สิ่งนี้ ไปที่เครื่องมือ> ตัวเลือก> นักออกแบบ> ยกเลิกการทำเครื่องหมาย "ป้องกันการบันทึกการเปลี่ยนแปลงที่ต้องมีการสร้างตารางใหม่" BTW นี้ไม่แนะนำสำหรับตารางที่ค่อนข้างใหญ่
Zafar

ใน PostgreSQL คุณสามารถเพิ่มข้อมูลประจำตัวในคอลัมน์จำนวนเต็มที่มีอยู่ด้วยคำสั่ง: แก้ไขตาราง {table_name} แก้ไขคอลัมน์ {column_name} เพิ่มการสร้างเสมอเป็นตัวตน (รีสตาร์ทด้วย {number});
Andrew Mackie

209

ใน SQL 2005 ขึ้นไปมีเคล็ดลับในการแก้ปัญหานี้โดยไม่ต้องเปลี่ยนหน้าข้อมูลของตาราง นี่เป็นสิ่งสำคัญสำหรับตารางขนาดใหญ่ที่การสัมผัสทุกหน้าข้อมูลอาจใช้เวลาหลายนาทีหรือหลายชั่วโมง เคล็ดลับยังใช้งานได้แม้ว่าคอลัมน์ข้อมูลประจำตัวเป็นคีย์หลักเป็นส่วนหนึ่งของดัชนีแบบคลัสเตอร์หรือแบบไม่รวมกลุ่มหรือ gotchas อื่น ๆ ซึ่งสามารถค้นหาโซลูชัน "เพิ่ม / ลบ / เปลี่ยนชื่อคอลัมน์" ที่ง่ายขึ้น

นี่คือเคล็ดลับ: คุณสามารถใช้คำสั่งALTER TABLE ... SWITCHของ SQL Server เพื่อเปลี่ยนสคีมาของตารางโดยไม่ต้องเปลี่ยนข้อมูลซึ่งหมายความว่าคุณสามารถแทนที่ตารางด้วย IDENTITY ด้วยสคีมาตารางที่เหมือนกัน แต่ไม่มีคอลัมน์ประจำตัว เคล็ดลับเดียวกันนี้ใช้เพื่อเพิ่มข้อมูลประจำตัวให้กับคอลัมน์ที่มีอยู่

โดยปกติALTER TABLE ... SWITCHจะใช้เพื่อแทนที่พาร์ติชันแบบเต็มอย่างมีประสิทธิภาพในตารางที่แบ่งพาร์ติชันด้วยพาร์ติชันใหม่ที่ว่างเปล่า แต่สามารถใช้ในตารางที่ไม่ได้แบ่งพาร์ติชันได้เช่นกัน

ฉันใช้เคล็ดลับนี้ในการแปลงภายใน 5 วินาทีคอลัมน์ของตาราง 2.5 พันล้านแถวจาก IDENTITY ถึงไม่ใช่ IDENTITY (เพื่อเรียกใช้แบบสอบถามหลายชั่วโมงซึ่งแผนแบบสอบถามทำงานได้ดีขึ้นสำหรับผู้ที่ไม่ใช่ 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; 

เห็นได้ชัดว่านี่มีส่วนเกี่ยวข้องมากกว่าคำตอบอื่น ๆ แต่ถ้าโต๊ะของคุณมีขนาดใหญ่ก็สามารถช่วยชีวิตได้จริง มีข้อแม้อยู่บ้าง:

  • เท่าที่ฉันทราบตัวตนเป็นสิ่งเดียวที่คุณสามารถเปลี่ยนเกี่ยวกับคอลัมน์ในตารางของคุณด้วยวิธีนี้ ไม่อนุญาตให้เพิ่ม / ลบคอลัมน์เปลี่ยนความสามารถเปลี่ยนได้ ฯลฯ
  • คุณจะต้องวางคีย์ foriegn ก่อนที่คุณจะทำสวิตช์และเรียกคืนหลังจากนั้น
  • เหมือนกับฟังก์ชัน SCHEMABINDING มุมมองและอื่น ๆ
  • ดัชนีของตารางใหม่ต้องตรงกันทุกประการ (คอลัมน์เดียวกัน, คำสั่งเดียวกัน, ฯลฯ )
  • ตารางเก่าและใหม่จะต้องอยู่ในกลุ่มไฟล์เดียวกัน
  • ใช้งานได้กับ SQL Server 2005 หรือใหม่กว่าเท่านั้น
  • ก่อนหน้านี้ฉันเชื่อว่าเคล็ดลับนี้ใช้ได้เฉพาะกับรุ่น Enterprise หรือ Developer ของ SQL Server (เนื่องจากพาร์ทิชันรองรับเฉพาะรุ่น Enterprise และ Developer) แต่ Mason G. Zhwiti ในความคิดเห็นของเขาด้านล่างบอกว่ามันใช้งานได้ใน SQL Standard Edition ด้วยเช่นกัน ฉันถือว่านี่หมายความว่าข้อ จำกัด ของ Enterprise หรือ Developer ไม่ได้ใช้กับ ALTER TABLE ... SWITCH

มีบทความที่ดีเกี่ยวกับ TechNetซึ่งระบุรายละเอียดข้อกำหนดไว้ด้านบน

อัปเดต - Eric Wuมีความคิดเห็นด้านล่างที่เพิ่มข้อมูลสำคัญเกี่ยวกับโซลูชันนี้ คัดลอกที่นี่เพื่อให้แน่ใจว่าได้รับความสนใจมากขึ้น:

มีข้อแม้อีกอย่างหนึ่งที่ควรค่าแก่การกล่าวถึง แม้ว่าตารางใหม่จะได้รับข้อมูลจากตารางเก่าอย่างมีความสุขและแถวใหม่ทั้งหมดจะถูกแทรกตามรูปแบบตัวตนพวกเขาจะเริ่มต้นที่ 1 และอาจแตกถ้าคอลัมน์ดังกล่าวเป็นคีย์หลัก ลองเรียกใช้DBCC CHECKIDENT('<newTableName>')ทันทีหลังจากเปลี่ยน ดูmsdn.microsoft.com/en-us/library/ms176057.aspxสำหรับข้อมูลเพิ่มเติม

หากตารางกำลังถูกขยายด้วยแถวใหม่ (หมายถึงคุณไม่มีอะไรมากหากการหยุดทำงานระหว่างการเพิ่ม IDENTITY และเพิ่มแถวใหม่จากนั้นDBCC CHECKIDENTคุณจะต้องตั้งค่าเมล็ดข้อมูลประจำตัวในตารางสกีมาใหม่ด้วยตนเอง ใหญ่กว่า ID ที่มีอยู่มากที่สุดในตารางเช่นIDENTITY (2435457, 1)คุณอาจรวมทั้งALTER TABLE...SWITCHและDBCC CHECKIDENTในธุรกรรม (หรือไม่ - ไม่ได้ทดสอบสิ่งนี้) แต่ดูเหมือนว่าการตั้งค่าเมล็ดด้วยตนเองจะง่ายขึ้นและปลอดภัยยิ่งขึ้น

แน่นอนถ้าไม่มีแถวใหม่ที่ถูกเพิ่มลงในตาราง (หรือที่พวกเขากำลังเพิ่มเป็นครั้งคราวเท่านั้นเช่นกระบวนการ ETL ทุกวัน) แล้วสภาพการแข่งขันครั้งนี้จะไม่เกิดขึ้นจึงDBCC CHECKIDENTเป็นเรื่องปกติ


5
หากหน่วยความจำของฉันถูกต้องฉันได้รับแนวคิดจากบทความนี้: sqlservercentral.com/articles/T-SQL/61979
Justin Grant

2
ปีงบประมาณสิ่งนี้ดูเหมือนว่าจะทำงานกับ SQL 2008 R2 รุ่นมาตรฐานด้วย บางทีพวกเขาเปิดใช้งานคุณลักษณะนี้เหมือนตอนนี้ที่พวกเขาเปิดใช้งานความสามารถในการเปิดใช้งานการบีบอัดข้อมูลสำรอง
Mason G. Zhwiti

3
@jbatista - คำถามของ OP ระบุว่าเขามีคีย์หลักบนโต๊ะอยู่แล้วและสามารถตรวจสอบค่าที่ถูกต้องได้แล้ว แต่เขาต้องการเปลี่ยนมันให้เป็นคอลัมน์ประจำตัว คำตอบของฉันข้างต้นเน้นที่กรณีการใช้งานที่แคบ: วิธีเพิ่ม IDENTITY ให้กับคอลัมน์โดยไม่ต้องเปลี่ยนข้อมูลใด ๆ วิธีการที่ฉันบันทึกเอกสารข้างต้นเป็นวิธีประหยัดเวลาอย่างมากสำหรับตารางขนาดใหญ่ หากคุณต้องการเปลี่ยนข้อมูลคุณจะต้องใช้โซลูชันอื่น ๆ
Justin Grant

3
มีข้อแม้อีกอย่างหนึ่งที่ควรกล่าวถึง แม้ว่าตารางใหม่จะได้รับข้อมูลจากตารางเก่าอย่างมีความสุขและแถวใหม่ทั้งหมดจะถูกแทรกตามรูปแบบตัวตนพวกเขาจะเริ่มที่ 1และอาจแตกถ้าคอลัมน์ดังกล่าวเป็นคีย์หลัก ลองเรียกใช้DBCC CHECKIDENT('<newTableName>')ทันทีหลังจากเปลี่ยน ดูmsdn.microsoft.com/en-us/library/ms176057.aspxสำหรับข้อมูลเพิ่มเติม
Eric Wu

3
นี่เป็นคำตอบที่ยอดเยี่ยม! นอกจากนี้โปรดทราบว่าการลบคอลัมน์จะต้องเหมือนกัน ดังนั้นหากคุณต้องการเปลี่ยนค่าความเป็นศูนย์คอลัมน์คุณจะต้องทำในภายหลัง กันไปสำหรับข้อ จำกัด PK ฉันยังเปลี่ยนค่าข้อมูลประจำตัวในการสร้างตารางให้ตรงกับค่าสูงสุดในปัจจุบัน: IDENTITY (maxID + 1, 1)
Philippe

71

คุณไม่สามารถเปลี่ยนคอลัมน์ให้เป็นคอลัมน์ตัวตนได้ สิ่งที่คุณต้องทำคือสร้างคอลัมน์ใหม่ซึ่งถูกกำหนดเป็นเอกลักษณ์จาก get-go จากนั้นปล่อยคอลัมน์เก่าแล้วเปลี่ยนชื่อใหม่เป็นชื่อเก่า

ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1)

ALTER TABLE (yourTable) DROP COLUMN OldColumnName

EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN'

มาร์ค


พารามิเตอร์ \ @objname อาจคลุมเครือหรืออ้างถึง \ @objtype (COLUMN) ผิด
Jenny O'Reilly

1
@ JennyO'Reilly: ใส่ลงในคำถามที่แยกต่างหากและแสดงให้เราเห็นคำสั่งที่สมบูรณ์ที่คุณใช้!
marc_s

2
มันเป็นขั้นตอน sp_rename ที่ล้มเหลว ฉันพบวิธีแก้ปัญหาใน stackoverflow โดยค้นหาข้อความแสดงข้อผิดพลาด ดูเหมือนว่าจะเป็นกฎไวยากรณ์ที่เข้มงวดกับวงเล็บแม้ว่าตารางของฉันจะไม่มีตัวอักษรพิเศษในชื่อของมัน แต่อย่างใด
Jenny O'Reilly

1
หรืออาจเป็นเช่น: 'ALTER TABLE (yourTable) DROP COLUMN OldColumnName' และ 'ALTER TABLE (yourTable) เพิ่ม OldColumnName INT IDENTITY INT (1,1)' ทำไมเปลี่ยนชื่อ: p
RK Sharma

Marc ฉันลองคำสั่งนี้อย่างแน่นอนบนโต๊ะขนาดใหญ่ (ประมาณ 300 ล้านแถว) แต่ฉันหยุดกระบวนการหลังจากนั้นประมาณ 10 นาที
Naomi

14

มีวิธีแก้ปัญหาที่ยอดเยี่ยมที่อธิบายไว้ที่นี่: SQL Server - เพิ่มหรือลบคุณสมบัติผู้ใช้อีเมลในคอลัมน์

ในระยะสั้นแก้ไขด้วยตนเองตารางของคุณใน SQL Manager สลับข้อมูลประจำตัวไม่บันทึกการเปลี่ยนแปลงเพียงแสดงสคริปต์ที่จะถูกสร้างขึ้นสำหรับการเปลี่ยนแปลงคัดลอกและใช้ในภายหลัง

มันประหยัดเวลามากเพราะ (สคริปต์) มีคีย์ต่างประเทศดัชนีและอื่น ๆ ทั้งหมดที่เกี่ยวข้องกับตารางที่คุณเปลี่ยน เขียนสิ่งนี้ด้วยตนเอง ... พระเจ้าห้าม


นี่เป็นวิธีแก้ปัญหาที่ฉันใช้ - SSMS สร้าง T-SQL เพื่อทำการเปลี่ยนแปลง ... ทำได้โดยการสร้างตาราง temp ใหม่ที่มีการออกแบบ schema เดียวกันจากนั้นคัดลอกแถวทั้งหมดลงในนั้นลบ orig และเปลี่ยนชื่อ . สามารถใช้เวลาเล็กน้อยเพื่อให้ทำงานได้อย่างสมบูรณ์ แต่ทำงานได้อย่างสมบูรณ์
mdelvecchio

ฉันไม่คิดว่า Pinal Dave จะพูดจริง ๆ ว่าคุณต้องเรียกใช้สคริปต์ที่คุณสร้างมันเป็นเพียงการแสดงให้เห็นว่าการเปลี่ยนแปลงผ่าน UI ทำเพื่อคุณ ...
Zack

ความสะดวกในการสร้างสคริปต์นี้ใน SSMS (ในการเปลี่ยนคำจำกัดความของตาราง) เป็นสิ่งอำนวยความสะดวกที่ถูกต้องเท่านั้นเมื่อทำการบันทึกตารางพาร์ติชัน ตำแหน่ง 'ภารกิจ' ที่เหมาะสมที่สุด -> 'ตารางสคริปต์' ลืมสคริปต์การแบ่งพาร์ติชันเสมอ!
Martijn van der Jagt

1
อาจเป็นประโยชน์กับใครบางคน เพื่อรับสคริปต์การเปลี่ยนแปลงหลังจากการเปลี่ยนแปลง คลิกขวาที่ตารางในโหมดการออกแบบบน SSMS และเลือกตัวเลือก "สร้างสคริปต์การเปลี่ยนแปลง" และบันทึกสคริปต์ในไดรฟ์ในระบบ
Vijai

11

พิจารณาที่จะใช้ลำดับแทนบัตรประจำตัว

ใน sql server 2014 (ฉันไม่รู้เกี่ยวกับเวอร์ชั่นที่ต่ำกว่า) คุณสามารถทำได้โดยใช้ลำดับ

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'

จากนั้นเพิ่มคอลัมน์ใหม่โดยใช้แก้ไขคิวรีเพื่อตั้งเป็นคีย์หลักและค่าตัวตน

ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1)

ตัวอย่างสำหรับการตั้งค่าคีย์หลัก

ชื่อคอลัมน์ที่สร้างขึ้นใหม่คือ UserID

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

ตอนนี้เราได้เพิ่มคีย์หลักและข้อมูลประจำตัวในคอลัมน์ที่มีอยู่บนตาราง


5

ฉันเป็นนักพัฒนา Java ที่เกิดขึ้นกับทีมโดยไม่มี DBA และเป็นที่หนึ่งในฐานะนักพัฒนาฉันไม่สามารถรับสิทธิ์ DBA ได้ ฉันถูกมอบหมายให้ย้ายสคีมาทั้งหมดระหว่างฐานข้อมูลสองแห่งดังนั้นโดยไม่ต้องมี DBA ฉันต้องทำและดำเนินการโดยเรียกใช้สคริปต์ไม่สามารถใช้ GUI ใน SQL Server 2008 ได้เนื่องจากฉันไม่มีสิทธิ์ของผู้ดูแลระบบ

ทุกอย่างถูกย้ายโดยไม่มีปัญหาอย่างไรก็ตามเมื่อเรียกใช้กระบวนงานที่เก็บไว้ใน schema.table ใหม่ฉันพบว่าฉันสูญเสียเขตข้อมูลระบุตัวตนในตาราง ฉันตรวจสอบสคริปต์ที่สร้างตารางอีกครั้งและอยู่ที่นั่น แต่ SQL Server ไม่ได้รับเมื่อรันสคริปต์ ฉันถูกบอกภายหลังโดย DBA ว่าเขาเคยเห็นปัญหาเดียวกันนี้มาก่อน

ไม่ว่าในกรณีใดสำหรับ SQL Server 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. ) คุณสามารถคลิกขวาที่แต่ละคีย์และสคริปต์นี้โดยใช้ SQL Server 2008

10. ) วาง FK (s) จากตารางการพึ่งพาโดยใช้ไวยากรณ์นี้:

ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]

11. ) วางตารางต้นฉบับ:

DROP TABLE dbo.table_name_old;

13. ) ขั้นตอนต่อไปเหล่านี้ขึ้นอยู่กับสคริปต์ที่คุณสร้างใน SQL Server 2008 ในขั้นตอนที่ 9

- เพิ่ม PK ไปยังตารางใหม่

- เพิ่ม FK ไปยังตารางใหม่

- เพิ่ม FK's กลับไปที่ตารางการพึ่งพา

14. ) ตรวจสอบว่าทุกอย่างถูกต้องและครบถ้วน ฉันใช้ GUI เพื่อดูตาราง

15. ) เปลี่ยนชื่อตารางใหม่เป็นชื่อตารางดั้งเดิม

exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';

ในที่สุดทุกอย่างทำงาน!


4

คุณไม่สามารถทำเช่นนั้นได้คุณจำเป็นต้องเพิ่มคอลัมน์ใหม่ปล่อยคอลัมน์เดิมและเปลี่ยนชื่อคอลัมน์ใหม่หรือสร้างตารางใหม่คัดลอกข้อมูลในและวางตารางเก่าตามด้วยการเปลี่ยนชื่อตารางใหม่เป็นเก่า โต๊ะ

ถ้าคุณใช้ SSMS และตั้งค่าคุณสมบัติตัวตนเป็น ON ในตัวออกแบบที่นี่คือสิ่งที่ SQL Server ทำเบื้องหลัง ดังนั้นหากคุณมีตารางชื่อ [ผู้ใช้] นี่คือสิ่งที่จะเกิดขึ้นหากคุณสร้างรหัสผู้ใช้และตัวตน

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

ต้องบอกว่ามีวิธีแฮ็คตารางระบบเพื่อให้บรรลุมันโดยการตั้งค่า bitwise แต่ที่ไม่รองรับและฉันจะไม่ทำมัน


4

ดังที่ฉันเข้าใจในกรณีปกติเรากำลังสร้างตารางที่มีคีย์หลักซึ่งมีคุณสมบัติข้อมูลประจำตัว
ดังนั้นเปลี่ยนชื่อหรือลบคอลัมน์ที่เกี่ยวข้องกับข้อ จำกัด ของคีย์หลัก จะไม่สามารถทำได้เพราะกฎข้อ จำกัด กำลังตรวจสอบโครงสร้างคอลัมน์ เพื่อให้บรรลุนี้เราต้องดำเนินการบางขั้นตอนด้วยวิธีดังต่อไปนี้ ให้เราสมมติว่าTableName = 'ลูกจ้าง'และColumnName = 'EmployeeId' 1. เพิ่มคอลัมน์ใหม่ 'EmployeeId_new' ในตาราง 'พนักงาน' ALTER ตารางพนักงานเพิ่ม EmployeeId_new INT IDENTITY ( 1,1)




  1. ตอนนี้ลบคอลัมน์ 'EmployeeId' ออกจากตาราง 'พนักงาน'
    ALTER TABLE Employee DROP COLUMN EmployeeId

  2. สิ่งนี้จะทำให้เกิดข้อผิดพลาดเนื่องจากกฎข้อ จำกัด ของคีย์หลักนั้นสามารถใช้งานได้และตรวจสอบโครงสร้างคอลัมน์
    * ### ' ข่าวสารเกี่ยวกับ 5074 ระดับ 16 สถานะ 1 บรรทัด 1 วัตถุ [PK_dbo.Employee] ขึ้นอยู่กับ colmn [EmployeeId]' ###

  3. ดังนั้นเราต้องลบข้อ จำกัด คีย์หลักก่อนจากตาราง 'พนักงาน' จากนั้นเราสามารถลบคอลัมน์
    แก้ไขข้อ จำกัด ของพนักงานตาราง DROP [PK_dbo.Employee]

  4. ตอนนี้เราสามารถลบคอลัมน์ 'EmployeeId' ออกจากตาราง 'พนักงาน' เช่นเดียวกับในขั้นตอนก่อนหน้าที่เราพบข้อผิดพลาด
    ALTER TABLE Employee DROP COLUMN EmployeeId

  5. ตอนนี้คอลัมน์ 'EmployeeId' ถูกลบออกจากตารางดังนั้นเราจะเปลี่ยนชื่อคอลัมน์ใหม่ที่เพิ่มใหม่ 'EmployeeId_new' ด้วย 'EmployeeId'
    sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN'

  6. ในการจัดเรียงตารางในรูปแบบเดียวกับเดิมเราต้องเพิ่มข้อ จำกัด คีย์หลักสำหรับคอลัมน์ 'EmployeeId'
    แก้ไขตารางพนักงานเพิ่มข้อ จำกัด [PK_dbo.Employee] คีย์หลัก (EmployeeId)

8. ขณะนี้ตาราง 'พนักงาน' กับ 'EmployeeId' ได้รับการแก้ไขสำหรับกฎข้อมูลประจำตัวพร้อมกับข้อ จำกัด คีย์หลักที่มีอยู่


3

โดยการออกแบบไม่มีวิธีง่ายๆในการเปิดหรือปิดคุณสมบัติตัวตนสำหรับคอลัมน์ที่มีอยู่ วิธีทำความสะอาดเพียงวิธีเดียวคือการสร้างคอลัมน์ใหม่และทำให้เป็นคอลัมน์ข้อมูลประจำตัวหรือสร้างตารางใหม่และย้ายข้อมูลของคุณ

หากเราใช้ SQL Server Management Studio เพื่อกำจัดค่าข้อมูลประจำตัวในคอลัมน์ "id" จะมีการสร้างตารางชั่วคราวใหม่ข้อมูลจะถูกย้ายไปยังตารางชั่วคราวตารางเก่าจะถูกลบและเปลี่ยนชื่อเป็นตารางใหม่

ใช้ Management Studio เพื่อทำการเปลี่ยนแปลงแล้วคลิกขวาในตัวออกแบบและเลือก "สร้างสคริปต์การเปลี่ยนแปลง"

คุณจะเห็นว่านี่คือสิ่งที่เซิร์ฟเวอร์ SQL ทำในพื้นหลัง


2

ไม่มีใครเศร้าเลย คุณสมบัติตัวตนอยู่ในตารางแทนที่จะเป็นคอลัมน์

วิธีที่ง่ายกว่าคือการทำใน GUI แต่หากนี่ไม่ใช่ตัวเลือกคุณสามารถไปในการคัดลอกข้อมูลได้ยาววางคอลัมน์วางคอลัมน์เพิ่มอีกครั้งด้วยข้อมูลประจำตัวและนำข้อมูลกลับมา

ดูที่นี่ สำหรับบัญชีระเบิดโดย


2

คลิกขวาที่ชื่อตารางใน Object Explorer คุณจะได้รับตัวเลือกบางอย่าง คลิกที่ 'ออกแบบ' แท็บใหม่จะเปิดขึ้นสำหรับตารางนี้ คุณสามารถเพิ่มข้อ จำกัด ของข้อมูลประจำตัวได้ที่นี่ใน 'คุณสมบัติคอลัมน์'


2

ในการแก้ไขคุณสมบัติเอกลักษณ์สำหรับคอลัมน์:

  • ใน Server Explorer คลิกขวาที่ตารางที่มีคุณสมบัติเอกลักษณ์ที่คุณต้องการแก้ไขและคลิก Open Table Definition ตารางจะเปิดขึ้นใน Table Designer
  • ล้างกล่องกาเครื่องหมายอนุญาต null สำหรับคอลัมน์ที่คุณต้องการเปลี่ยนแปลง
  • ในแท็บคุณสมบัติคอลัมน์ขยายคุณสมบัติข้อมูลจำเพาะของผู้ใช้
  • คลิกเซลล์กริดสำหรับคุณสมบัติ Is Identity child และเลือก Yes จากรายการดร็อปดาวน์
  • พิมพ์ค่าในเซลล์ Identity Seed ค่านี้จะถูกกำหนดให้กับแถวแรกในตาราง ค่า 1 จะถูกกำหนดโดยค่าเริ่มต้น

แค่นี้แหละและมันก็ใช้ได้ผลสำหรับฉัน


2

หากคุณบังเอิญใช้ Visual Studio 2017+

  1. ใน Server Object Explorer คลิกขวาที่ตารางของคุณและเลือก "ดูรหัส"
  2. เพิ่มโมเดอเรเตอร์ "IDENTITY" ในคอลัมน์ของคุณ
  3. ปรับปรุง

มันจะทำทุกอย่างให้คุณ


ใช่ ขอบคุณสำหรับการแนะนำสิ่งนี้! ฉันไม่มี 'SSMS รุ่นหนึ่งในกล่อง Windows 7 ของฉันที่อนุญาตให้ฉันทำการเปลี่ยนแปลงการออกแบบในตารางบนเซิร์ฟเวอร์การผลิตของฉันเพราะมันคือ 2017, SSMS ของฉันคือ 2014, และ 2017 SSMS ต้องการ Windows 10 คุณทำให้วันของฉัน เข้าสู่ VS 2017> Server Explorer> ทำการเชื่อมต่อใหม่กับ SQL Server ที่ผลิต> คลิกขวาบนตาราง> "นิยาม Table Open"> Wala!
JustJohn

จริง ๆ แล้วฉันพบว่าคุณสามารถคลิกขวาบนฟิลด์และเลือกคุณสมบัติและสร้างข้อมูลประจำตัวที่นั่นเลือกใช่หรือไม่
JustJohn

1

หากผู้โพสต์ดั้งเดิมต้องการตั้งคอลัมน์ที่มีอยู่ให้เป็นPRIMARY KEYตารางและไม่ต้องการให้คอลัมน์เป็นIDENTITYคอลัมน์ (สองสิ่งที่ต่างกัน) สิ่งนี้สามารถทำได้ผ่านทาง t-SQL ด้วย:

ALTER TABLE [YourTableName]
ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey])

หมายเหตุวงเล็บรอบชื่อคอลัมน์หลังจากPRIMARY KEYตัวเลือก

แม้ว่าโพสต์นี้จะเก่าแล้วและฉันกำลังตั้งสมมติฐานว่าผู้ร้องขอต้องการ แต่ฉันรู้สึกว่าข้อมูลเพิ่มเติมนี้อาจเป็นประโยชน์ต่อผู้ใช้ที่พบหัวข้อนี้เนื่องจากฉันเชื่อว่าการสนทนาอาจทำให้คนเชื่อว่าคอลัมน์ที่มีอยู่ไม่สามารถตั้งค่าเป็น คีย์หลักโดยไม่ต้องเพิ่มเป็นคอลัมน์ใหม่ก่อนซึ่งจะไม่ถูกต้อง


1

ตามสภาพปัจจุบันของฉันฉันทำตามวิธีนี้ ฉันต้องการให้ข้อมูลประจำตัวในตารางหลักหลังจากข้อมูลถูกแทรกผ่านสคริปต์

ตามที่ฉันต้องการผนวกข้อมูลประจำตัวดังนั้นจึงเริ่มจาก 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/

เพิ่มคีย์หลักให้กับตารางที่มีอยู่


0

ฉันไม่เชื่อว่าคุณสามารถเปลี่ยนคอลัมน์ที่มีอยู่ให้เป็นคอลัมน์ข้อมูลประจำตัวโดยใช้ tsql อย่างไรก็ตามคุณสามารถทำได้ผ่านมุมมองการออกแบบ Enterprise Manager

หรือคุณสามารถสร้างแถวใหม่เป็นคอลัมน์ข้อมูลประจำตัวแล้วปล่อยคอลัมน์เก่าจากนั้นเปลี่ยนชื่อคอลัมน์ใหม่ของคุณ

ALTER TABLE FooTable
ADD BarColumn INT IDENTITY(1, 1)
               NOT NULL
               PRIMARY KEY CLUSTERED

2
โปรดทราบว่าหากคุณทำผ่าน SSMS / Enterprise Manager - คุณจะสร้างตารางใหม่คัดลอกข้อมูลวางตารางเก่าและเปลี่ยนชื่อใหม่ ที่อาจมีราคาแพงมากเมื่อคุณมีตารางใหญ่ ...
สกอตต์ไอวี่ย์

0

โดยทั่วไปมีสี่ขั้นตอนตรรกะ

  1. สร้างคอลัมน์ข้อมูลเฉพาะตัวใหม่ เปิดการแทรกข้อมูลประจำตัวสำหรับคอลัมน์ใหม่นี้

  2. แทรกข้อมูลจากคอลัมน์ต้นฉบับ (คอลัมน์ที่คุณต้องการแปลงเป็นข้อมูลประจำตัว) ไปยังคอลัมน์ใหม่นี้

  3. ปิดการแทรกข้อมูลประจำตัวสำหรับคอลัมน์ใหม่

  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


0

สร้างสคริปต์สำหรับตารางทั้งหมดด้วย primary key = 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.