130

特定のデフォルト制約が存在するかどうかをテストしようとしています。sysobjectsテーブルは使用したくありませんが、より標準的なINFORMATION_SCHEMAを使用します。

以前、これを使用してテーブルと主キーの制約をチェックしましたが、デフォルトの制約はどこにも表示されません。

彼らはそこにいませんか?(私はMS SQL Server 2000を使用しています)。

編集:私は制約の名前で取得しようとしています。

4

15 に答える 15

137

私が理解しているように、デフォルト値の制約はISO標準の一部ではないため、INFORMATION_SCHEMAには表示されません。クロスプラットフォームであるため、INFORMATION_SCHEMAはこの種のタスクに最適な選択のようですが、情報が利用できない場合は、SQL Serverで廃止されたシステムテーブルビューではなく、オブジェクトカタログビュー(sys。*)を使用する必要があります。 2005年以降。

以下は@user186476の答えとほとんど同じです。指定された列のデフォルト値制約の名前を返します。(SQL Server以外のユーザーの場合、デフォルトの名前を削除するにはデフォルトの名前が必要です。デフォルトの制約に自分で名前を付けない場合、SQLServerは「DF_TableN_Colum_95AFE4B5」のようなおかしな名前を作成します。変更しやすくするため将来のスキーマでは、常に明示的に制約に名前を付けてください!)

-- returns name of a column's default value constraint 
SELECT
    default_constraints.name
FROM 
    sys.all_columns

        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id

        INNER JOIN 
    sys.schemas
        ON tables.schema_id = schemas.schema_id

        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id

WHERE 
        schemas.name = 'dbo'
    AND tables.name = 'tablename'
    AND all_columns.name = 'columnname'
于 2012-03-15T14:11:48.457 に答える
47

以下を使用して、デフォルトの制約が関連付けられているテーブル名と列名を指定することで、結果をさらに絞り込むことができます。

select * from sysobjects o 
inner join syscolumns c
on o.id = c.cdefault
inner join sysobjects t
on c.id = t.id
where o.xtype = 'D'
and c.name = 'Column_Name'
and t.name = 'Table_Name'
于 2009-02-12T15:19:41.937 に答える
41

Information_Schemaビューにデフォルトの制約名がないようです。

SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name 名前でデフォルトの制約を見つけるために使用

于 2008-09-27T00:33:52.947 に答える
14

以下のスクリプトは、スクリプトが実行されているデータベース内のユーザー テーブルのすべての既定の制約と既定値を一覧表示します。

SELECT  
        b.name AS TABLE_NAME,
        d.name AS COLUMN_NAME,
        a.name AS CONSTRAINT_NAME,
        c.text AS DEFAULT_VALUE
FROM sys.sysobjects a INNER JOIN
        (SELECT name, id
         FROM sys.sysobjects 
         WHERE xtype = 'U') b on (a.parent_obj = b.id)
                      INNER JOIN sys.syscomments c ON (a.id = c.id)
                      INNER JOIN sys.syscolumns d ON (d.cdefault = a.id)                                          
 WHERE a.xtype = 'D'        
 ORDER BY b.name, a.name
于 2011-06-13T09:28:27.063 に答える
8

列またはテーブル名による制約を取得する場合、またはデータベース内のすべての制約を取得する場合は、他の回答を参照してください。ただし、質問が求めるもの、つまり「特定のデフォルトの制約が存在するかどうかをテストする...制約の名前で」を探しているだけの場合は、はるかに簡単な方法があります。

sysobjectsまたは他のsysテーブルをまったく使用しない、将来性のある答えを次に示します。

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END
于 2015-09-23T22:14:02.413 に答える
3
select c.name, col.name from sys.default_constraints c
    inner join sys.columns col on col.default_object_id = c.object_id
    inner join sys.objects o  on o.object_id = c.parent_object_id
    inner join sys.schemas s on s.schema_id = o.schema_id
where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName
于 2009-10-08T15:46:35.037 に答える
2

INFORMATION_SCHEMA.COLUMNS の COLUMN_DEFAULT 列は探しているものですか?

于 2008-09-26T20:38:17.133 に答える
0

INFORMATION_SCHEMA にはないと思います。おそらく、sysobjects または関連する非推奨のテーブル/ビューを使用する必要があります。

INFORMATION_SCHEMA.TABLE_CONSTRAINTS にこのタイプがあると思われるかもしれませんが、私にはありません。

于 2008-09-26T21:26:54.317 に答える
0

次のスクリプトを使用して、すべてのデフォルト (sp_binddefaults) とすべてのデフォルトの制約を取得しています。

SELECT 
    t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName
FROM  
    sys.all_columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    JOIN sys.schemas s ON t.schema_id = s.schema_id
    LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name)
WHERE 
    SC.COLUMN_DEFAULT IS NOT NULL
    --WHERE t.name = '' and c.name = ''
于 2016-03-10T09:22:15.963 に答える
0

おそらく、他の一部の SQL DBMS では「デフォルトの制約」が実際には制約ではないため、「INFORMATION_SCHEMA.TABLE_CONSTRAINTS」にその名前が見つからないため、他の人が既に述べたように「INFORMATION_SCHEMA.COLUMNS」が最善の策です。

(ここでは SQLServer を無視)

「デフォルトの制約」の名前を知る必要があるときに考えられる唯一の理由は、SQLServer が"ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."コマンドをサポートしていない場合です。しかし、あなたはすでに非標準ゾーンにいて、必要なものを得るために製品固有の方法を使用する必要があります.

于 2008-09-26T21:55:41.177 に答える