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

デフォルトのテーブルを作成するスクリプトがありますが、制約を削除したいと考えています。テーブルを再作成した後に制約を削除したい場合を除いて、名前を知っているので手動で問題はありません。したがって、ドロップ制約スクリプトを再実行するだけです。名前を明示的に使用せずにこれを行うにはどうすればよいですか?

4

1 に答える 1

1

これを試すことができます-これにより、システムカタログビューで必要な情報が検索され、コピーして実行できる「ドロップ」T-SQLコマンドが作成され、システム名の既定の制約が削除されます。

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
于 2012-10-18T13:19:53.270 に答える