環境與版本
作業系統:Window10 64x 版本:2004
資料庫產品版本:Microsoft SQL Server Developer (64-bit) v18.4
資料庫版本編號:15.0.2070.41
查看資料庫內的條件約束Constraint
可以查看整個資料庫內用到的Constranint 名稱,或是加上條件抓取特定資料表的Constraint。
-- =============================================
-- Author: Steven玄
-- ALTER date: 20201028
-- Description: 查看 資料庫的 條件Constraint
-- =============================================
SELECT
dense_rank() over(order by A.[crdate],A.[refdate],A.[id] asc) as [rk]
,A.[name] AS [Constraint_name]
,A.[id]
,A.[type]
,A.[crdate]
,A.[refdate]
,B.[id] as [OBJECT_ID]
FROM sysobjects AS A INNER JOIN syscolumns AS B --sysobjects
ON A.[id] = B.[cdefault]
where A.[type] ='D' --條件Constraint
--AND B.[id] = OBJECT_ID('TableName') --縮小搜尋範圍資料表名稱 大量刪除約束條件Constraint 範本 的 SQL程式碼範本
需要依照需求調整一個地方 1.設定要更動的資料表表的名稱 和2.設定相關條件
--!!小心使用!!!!小心使用!!!!小心使用!!!!小心使用!!!!小心使用!!!!小心使用!!!!小心使用!!!!小心使用!!
-- =============================================
-- Author: Steven玄
-- ALTER date: 20201028
-- Description: 產生 大量刪除 條件Constraint 的字串 (通常自串會很長)
-- =============================================
--!!Watch out!!!!Watch out!!!!Watch out!!!!Watch out!!!!Watch out!!!!Watch out!!
-- 創暫存TABLE
DECLARE @Constraint_TABLE TABLE (
[rk] [int] NOT NULL, --順序
[Constraint_name] [nvarchar](50) NULL, --預存程序名稱
[id] [nvarchar](20) NULL, --Constraint ID
[type] [nvarchar](50) NULL, --項目類別
[crdate] [DATETIME] NULL, --創建時間
[refdate] [DATETIME] NULL, --修改時間
[OBJECT_ID][nvarchar](20) NULL --物件ID
);
DECLARE @Table VARCHAR(20) = 'TAD_201' --設定要更動的資料表表的名稱
--下條件把多餘的預存程序放進去這個taBLE
INSERT INTO @Constraint_TABLE
--可先查看
SELECT
dense_rank() over(order by A.[crdate],A.[refdate],A.[id] asc) as [rk]
,A.[name] AS [Constraint_name]
,A.[id]
,A.[type]
,A.[crdate]
,A.[refdate]
,B.[id] as [OBJECT_ID]
FROM sysobjects AS A INNER JOIN syscolumns AS B --sysobjects
ON A.[id] = B.[cdefault]
where A.[type] ='D' --條件Constraint
AND B.[id] = OBJECT_ID(@Table) --表的名稱
--設定相關條件
AND A.[name] like 'DF_TAD%' --Constraint 名稱
--組DROP預存程序字串
DECLARE @MAX BIGINT;
DECLARE @Min BIGINT;
SELECT @MAX = MAX([rk]),@Min=MIN([rk]) FROM @Constraint_TABLE
declare @string nvarchar(max) --字串
SET @string = 'ALTER TABLE ['+@Table+'] DROP CONSTRAINT '
DECLARE @Constraint_name nvarchar(100) --預存程序名稱
WHILE(@Min <= @MAX)
BEGIN
SELECT @Constraint_name = [Constraint_name] FROM @Constraint_TABLE WHERE [rk] = @Min
SET @string += ' ['+@Constraint_name+'] ';
if @Min=@MAX SET @string += ''
ELSE SET @string += ',';
SET @Min=@Min+1
END
SELECT @string;--回傳字串
