Как найти ограничение по умолчанию, используя INFORMATION_SCHEMA? - PullRequest
104 голосов
/ 27 сентября 2008

Я пытаюсь проверить, существует ли данное ограничение по умолчанию. Я не хочу использовать таблицу sysobjects, но более стандартную INFORMATION_SCHEMA.

Я использовал это для проверки таблиц и ограничений первичного ключа ранее, но я нигде не вижу ограничений по умолчанию.

Их там нет? (Я использую MS SQL Server 2000).

РЕДАКТИРОВАТЬ: я ищу, чтобы получить имя ограничения.

Ответы [ 13 ]

107 голосов
/ 15 марта 2012

Насколько я понимаю, ограничения по умолчанию не являются частью стандарта ISO, поэтому они не отображаются в INFORMATION_SCHEMA. INFORMATION_SCHEMA кажется лучшим выбором для такого рода задач, потому что он кроссплатформенный, но если информация недоступна, следует использовать представления каталога объектов (sys. *) Вместо представлений системной таблицы, которые не рекомендуются в SQL Server. 2005 и позже.

Ниже в значительной степени совпадает с ответом @ user186476. Возвращает имя ограничения значения по умолчанию для данного столбца. (Для пользователей, отличных от SQL Server, вам нужно имя по умолчанию, чтобы удалить его, и если вы не называете ограничение по умолчанию самостоятельно, SQL Server создает какое-то сумасшедшее имя, например «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'
41 голосов
/ 12 февраля 2009

Вы можете использовать следующее, чтобы еще больше сузить результаты, указав Имя таблицы и Имя столбца, с которыми связано ограничение по умолчанию:

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'
36 голосов
/ 27 сентября 2008

Кажется, что в представлениях Information_Schema нет имен ограничений по умолчанию.

использовать SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name найти ограничение по умолчанию по имени

12 голосов
/ 13 июня 2011

Сценарий ниже перечисляет все ограничения по умолчанию и значения по умолчанию для пользовательских таблиц в базе данных, в которой он выполняется:

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
3 голосов
/ 24 сентября 2015

Если вы хотите получить ограничение по именам столбцов или таблиц или хотите получить все ограничения в базе данных, посмотрите другие ответы. Однако, если вы просто ищете именно то, что задает вопрос, а именно: "проверить, существует ли данное ограничение по умолчанию ... по имени ограничения" , тогда есть гораздо более простой способ.

Вот ответ на перспективу, который вообще не использует sysobjects или другие sys таблицы:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END
3 голосов
/ 08 октября 2009
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
2 голосов
/ 27 сентября 2008

Является ли столбец COLUMN_DEFAULT INFORMATION_SCHEMA.COLUMNS тем, что вы ищете?

1 голос
/ 28 сентября 2017
WHILE EXISTS( 
    SELECT * FROM  sys.all_columns 
    INNER JOIN sys.tables ST  ON all_columns.object_id = ST.object_id
    INNER JOIN sys.schemas ON ST.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 ST.name = 'MyTable'
)
BEGIN 
DECLARE @SQL NVARCHAR(MAX) = N'';

SET @SQL = (  SELECT TOP 1
     'ALTER TABLE ['+  schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';'
   FROM 
      sys.all_columns

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

         INNER JOIN 
      sys.schemas
         ON ST.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 ST.name = 'MyTable'
      )
   PRINT @SQL
   EXECUTE sp_executesql @SQL 

   --End if Error 
   IF @@ERROR <> 0 
   BREAK
END 
0 голосов
/ 01 ноября 2017

Просмотр каталога объектов : sys.default_constraints

Представления информационной схемы INFORMATION_SCHEMA соответствуют ANSI, но ограничения по умолчанию не являются частью стандарта ISO. Microsoft SQL Server предоставляет представления системного каталога для получения информации о метаданных объекта SQL Server.

sys.default_constraints представление системного каталога, используемое для получения информации об ограничениях по умолчанию.

SELECT so.object_id TableName,
       ss.name AS TableSchema,
       cc.name AS Name,
       cc.object_id AS ObjectID,              
       sc.name AS ColumnName,
       cc.parent_column_id AS ColumnID,
       cc.definition AS Defination,
       CONVERT(BIT,
               CASE cc.is_system_named
                   WHEN 1
                   THEN 1
                   ELSE 0
               END) AS IsSystemNamed,
       cc.create_date AS CreationDate,
       cc.modify_date AS LastModifiednDate
FROM sys.default_constraints cc WITH (NOLOCK)
     INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id
     LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id
     LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id
                                               AND sc.object_id = cc.parent_object_id
ORDER BY so.name,
         cc.name;
0 голосов
/ 10 марта 2016

Я использую следующий скрипт для получения всех значений по умолчанию (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 = ''
...