2013-07-06 66 views
6

我有以下幾點:如何檢查SQL Server約束是否存在?

IF OBJECT_ID(N'[dbo].[webpages_Roles_UserProfiles_Target]', 'xxxxx') IS NOT NULL 
    DROP CONSTRAINT [dbo].[webpages_Roles_UserProfiles_Target] 

我希望能夠檢查是否有存在之前,我放棄它的約束。上面的代碼使用'U'類型的表格。

我該如何修改上面的代碼(更改xxxx)以使其檢查約束的存在?

回答

20
SELECT 
    * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 

要不試試這個

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, 
SCHEMA_NAME(schema_id) AS SchemaName, 
OBJECT_NAME(parent_object_id) AS TableName, 
type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc LIKE '%CONSTRAINT' 

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.TableName')) 
BEGIN 
ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 
+0

如果表中有PK,做這樣的事情如果不存在(SELECT名稱FROM系統對象WHERE的xtype = 'PK' AND parent_obj = OBJECT_ID( '表名')) BEGIN ALTER TABLE表名DROP CONSTRAINT CONSTRAINTNAME END –

2

,你可以這樣做:

IF EXISTS 
    (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CONSTRAINT_NAME]') 
     AND type in (N'U')) 

BEGIN 
.... 
END 
ELSE 
+3

'鍵入(N'U')'檢查是否存在表[不是約束](http://msdn.microsoft.com/en-us/library/ms190324.aspx) –

+0

right Martin。不應該包含(N'U')用於約束檢查。 –

+0

鍵入(N'UQ')對於檢查唯一約束的類型是正確的。 –

3

嘗試是這樣的

IF OBJECTPROPERTY(OBJECT_ID('constraint_name'), 'IsConstraint') = 1 
    ALTER TABLE table_name DROP CONSTRAINT constraint_name 
+0

IF OBJECT_ID('Schema.keyname')IS NULL ALTER TABLE Schema.tablename ADD CONSTRAINT keyname ... –

+0

@MartinB是的,這看起來像是一個很好的'ADD CONSTRAINT'快捷鍵!對於'DROP CONSTRAINT'跳過'IsConstraint'檢查'ALTER TABLE'失敗的風險,因爲如果'Schema.keyname'是索引或表格,'OBJECT_ID'將返回非null。 – wqw