49

現在公開されている次のような列を持つテーブルがあります。

name NVARCHAR(128) NOT NULL DEFAULT ''

私はこのように列を変更してnull許容にします:

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

ただし、テーブルの1つのインスタンスで「DF__mytable__datab__7DE4B36」という名前のデフォルトの制約はそのまま残ります。元の作成者が制約に名前を付けていれば、これは回避できたはずです。これらのテーブルのインスタンスがいくつかありますが、持っているすべてのテーブルのすべての制約を手動で削除したくありません。このテーブルのすべてのインスタンスに均一に適用できる、SQL Serverの列にこのデフォルトの制約をドロップする最も簡単でエレガントな方法は何ですか?

編集

これは私が使用することになったスクリプトです:

DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255) 

-- Find table id
SET @table_id = OBJECT_ID('mytable')

-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = 'name'

-- Remove default constraint from name column
SELECT @sql = 'ALTER TABLE mytable DROP CONSTRAINT ' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql

これを実現するために使用できる別のスクリプトは、ここにあります 。名前を知らずにSQLのデフォルトの制約を削除する方法は?

ありがとう!

4

3 に答える 3

78

これは、制約を削除する方法です

ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
   DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO

スクリプト付き

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'dotnetnuke'
set @table = 'tabs'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END

クレジットはJonGallowayhttp ://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspxに移動します

于 2012-05-27T21:18:59.637 に答える
7

私は提案します:

DECLARE @sqlStatement nvarchar(MAX),
        @tableName nvarchar(50) = 'TripEvent',
        @columnName nvarchar(50) = 'CreatedDate';

SELECT                  
    @sqlStatement = 'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT ' + dc.name + ';'
FROM            
    sys.default_constraints AS dc
LEFT JOIN   
    sys.columns AS sc ON (dc.parent_column_id = sc.column_id)
WHERE 
    dc.parent_object_id = OBJECT_ID(@tableName)
    AND type_desc = 'DEFAULT_CONSTRAINT'
    AND sc.name = @columnName

PRINT'   ['+@tableName+']:'+@@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+';  '+@sqlStatement;

IF (LEN(@sqlStatement) > 0)
     EXEC sp_executesql @sqlStatement
于 2016-04-26T16:29:40.413 に答える
4

私は同じ問題に直面し、この解決策によって解決したので、前の質問を参照したいと思います。まず第一に、制約は常にそのHash名前に値を使用して構築されます。したがって、問題は、これHASHがマシンまたはデータベースによって異なることです。たとえば、DF__Companies__IsGlo__6AB17FE4ここ6AB17FE4にハッシュ値(8ビット)があります。だから私はすべての人に実りある単一のスクリプトを参照しています

DECLARE @Command NVARCHAR(MAX)
     declare @table_name nvarchar(256)
     declare @col_name nvarchar(256)
     set @table_name = N'ProcedureAlerts'
     set @col_name = N'EmailSent'

     select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select d.name
     from 
         sys.tables t
         join sys.default_constraints d on d.parent_object_id = t.object_id
         join sys.columns c on c.object_id = t.object_id
                               and c.column_id = d.parent_column_id
     where 
         t.name = @table_name
         and c.name = @col_name) + ']'

    --print @Command
    exec sp_executesql @Command

デフォルトの制約が削除されます。ただし、もう一度作成したい場合は、これを試すことができます

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

DROP最後に、コマンドを実行して列を削除するだけです。

于 2017-06-06T06:52:38.053 に答える