2012-10-18 39 views
1
CREATE TABLE [dbo].[tmp_rg_xx_LBJ] 
(
[ROWVERSION] [bigint] NULL, 
[ROWDATE] [datetime] NULL, 
[SAPNO] [int] NOT NULL DEFAULT 1) 


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF__tmp_rg_xx__SAPNO__1B0907CE]') AND type = 'D') 
BEGIN 
ALTER TABLE [dbo].[LBJ] DROP CONSTRAINT [DF__tmp_rg_xx__SAPNO__1B0907CE] 
END 

GO 

我有一個腳本,創建一個默認的表,但我想刪除約束。手動沒問題,因爲我知道名稱,除了我想在重新創建表之後刪除約束。所以我可以重新運行放置約束腳本。你如何在沒有明確使用名字的情況下做到這一點?明確約束下降不使用名稱

+1

你可以查找約束在'SYS。物體「,就像你所做的一樣,但是如果你在之後通過名稱引用它的特定約束將是最好的方法。這就像詢問如何查詢表而不實際使用表名。 –

+0

它會始終啓動DF__tmp_rg_xx__SAPNO我可以使用嗎? – icecurtain

+3

當你創建它們時,你應該養成明確命名你的約束的習慣 - 這會讓它們變得更加容易! –

回答

1

你可以試試這個 - 這將查找在系統目錄中享有必要的信息,並創建一個「降」 T-SQL命令,你可以複製&執行擺脫你的系統名爲default約束:

SELECT 
    DropCmd = 'ALTER TABLE ' + t.name + ' DROP CONSTRAINT ' + df.Name 
FROM sys.default_constraints df 
INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id 
INNER JOIN sys.tables t ON c.object_id = t.object_id 
WHERE 
    t.Name = 'YourTableNameHere' 
    AND c.name = 'YourColumnNameHere' 

如果你需要把這個變成你自己的腳本 - 您可以分配DropCmd給一個變量,然後使用動態SQL執行該SQL語句:

DECLARE @DropStatement NVARCHAR(200) 

SELECT 
    @DropStatement = N'ALTER TABLE ' + t.name + N' DROP CONSTRAINT ' + df.Name 
FROM sys.default_constraints df 
INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id 
INNER JOIN sys.tables t ON c.object_id = t.object_id 
WHERE 
    t.Name = 'YourTableName' 
    AND c.name = 'YourColumnName' 

EXEC sp_executesql @DropStatement 
+1

叫我先生thicky [SAPNO] [INT] NOT NULL約束「SAPNO」缺省爲1)現在我知道了Constaint名稱所有的時間你的努力,雖然球員 – icecurtain

+0

感謝:養成習慣打電話給你的默認約束的東西像'DF _....' - 所以你可以保持它與'SAPNO'的實際列名不同。我傾向於稱它們爲'DF_(tablename)_(columnName)' - 所以在你的情況下'DF_tmp_rg_xx_LBJ_SAPNO'清晰明確 – icecurtain

+0

@icecurtain –