ฉันต้องการปล่อยข้อ จำกัด เริ่มต้นทั้งหมดตรวจสอบข้อ จำกัด ข้อ จำกัด เฉพาะคีย์หลักและคีย์ต่างประเทศจากตารางทั้งหมดในฐานข้อมูล SQL Server ฉันรู้วิธีรับชื่อข้อ จำกัด ทั้งหมดsys.objects
แต่ฉันจะเติมALTER TABLE
ส่วนได้อย่างไร
ฉันต้องการปล่อยข้อ จำกัด เริ่มต้นทั้งหมดตรวจสอบข้อ จำกัด ข้อ จำกัด เฉพาะคีย์หลักและคีย์ต่างประเทศจากตารางทั้งหมดในฐานข้อมูล SQL Server ฉันรู้วิธีรับชื่อข้อ จำกัด ทั้งหมดsys.objects
แต่ฉันจะเติมALTER TABLE
ส่วนได้อย่างไร
คำตอบ:
คุณสามารถรับข้อมูลนี้ได้อย่างง่ายดายโดยการเข้าร่วมsys.tables.object_id = sys.objects.parent_object_id
ประเภทวัตถุเหล่านั้น
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';
SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];
PRINT @sql;
--EXEC sys.sp_executesql @sql;
PRINT
เป็นเพียงที่นั่น eyeballing - ถ้าคุณมีจำนวนมากของข้อ จำกัด ก็ไม่อาจแสดงสคริปต์ทั้งหมดเพราะมันจะถูก จำกัด 8K ในกรณีดังกล่าวให้ดูเคล็ดลับนี้สำหรับวิธีอื่นในการตรวจสอบความถูกต้องของสคริปต์ก่อนเรียกใช้
เมื่อคุณพอใจกับผลลัพธ์EXEC
แล้ว
ORDER BY (CASE WHEN c.[type] IN ('PK', 'UQ') THEN 1 ELSE 0 END)
ฉันเริ่มต้นด้วยคำตอบที่ยอมรับและปรับเปลี่ยนโครงสร้างเพื่อใช้ a while loop แทนที่จะสร้างคำสั่ง sql แบบเต็มใน sql แบบไดนามิก ฉันชอบสิ่งนี้ดีกว่าด้วยเหตุผลหลายประการ
แบบสอบถามไม่ได้ถูกเก็บไว้ในตัวแปร @sql ขนาดใหญ่ การใช้งานนี้ช่วยให้สามารถพิมพ์สำหรับแต่ละข้อ จำกัด ที่ลดลงเพื่อวัตถุประสงค์ในการเข้าสู่ระบบในการส่งออก การดำเนินการดูเหมือนเร็วขึ้นเล็กน้อยในการทดสอบหน่วยของฉัน
Set NoCount ON
Declare @schemaName varchar(200)
set @schemaName=''
Declare @constraintName varchar(200)
set @constraintName=''
Declare @tableName varchar(200)
set @tableName=''
While exists
(
SELECT c.name
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
and c.name > @constraintName
)
Begin
-- First get the Constraint
SELECT
@constraintName=min(c.name)
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
and c.name > @constraintName
-- Then select the Table and Schema associated to the current constraint
SELECT
@tableName = t.name,
@schemaName = s.name
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.name = @constraintName
-- Then Print to the output and drop the constraint
Print 'Dropping constraint ' + @constraintName + '...'
Exec('ALTER TABLE [' + @schemaName + N'].[' + @tableName + N'] DROP CONSTRAINT [' + @constraintName + ']')
End
Set NoCount OFF