Jak znaleźć domyślne ograniczenie za pomocą schematu informacyjnego?

Próbuję sprawdzić, czy dane ograniczenie domyślne istnieje. Nie chcę używać tabeli sysobjects, ale bardziej standardowej INFORMATION_SCHEMA.

Używałem tego do sprawdzania tabel i podstawowych ograniczeń klucza, ale nigdzie nie widzę domyślnych ograniczeń.

Nie ma ich tam? (Używam MS SQL Server 2000).

EDIT: Szukam nazwy ograniczenia.

Author: vinay Maneti, 2008-09-27

13 answers

Jak rozumiem, domyślne ograniczenia wartości nie są częścią standardu ISO, więc nie pojawiają się w INFORMATION_SCHEMA. INFORMATION_SCHEMA wydaje się najlepszym wyborem dla tego rodzaju zadań, ponieważ jest wieloplatformowy, ale jeśli informacje nie są dostępne, należy użyć widoku katalogu obiektów (sys.* ) zamiast systemowych widoków tabel, które są przestarzałe w SQL Server 2005 i nowszych.

Poniżej jest prawie taka sama jak odpowiedź @user186476. Zwraca nazwę domyślnej ograniczenie wartości dla danej kolumny. (Dla użytkowników innych niż SQL Server, potrzebujesz nazwy domyślnej, aby ją usunąć, a jeśli nie podasz nazwy domyślnego ograniczenia, SQL Server tworzy jakąś szaloną nazwę, taką jak "DF_TableN_Colum_95AFE4B5". Aby ułatwić zmianę schematu w przyszłości, zawsze wyraźnie nazwij swoje ograniczenia!)

-- 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'
 98
Author: Robert Calhoun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 12:56:40

Możesz użyć poniższej opcji, aby jeszcze bardziej zawęzić wyniki, podając nazwę tabeli i nazwę kolumny, z którą powiązane jest domyślne ograniczenie:

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'
 38
Author: Tim Lentine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 13:20:15

W widokach Information_Schema nie ma domyślnych nazw ograniczeń.

Użyj SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name aby znaleźć domyślne ograniczenie po nazwie

 36
Author: devio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-09 20:11:10

Poniższy skrypt wyświetla wszystkie domyślne ograniczenia oraz domyślne wartości tabel użytkownika w bazie danych, w której jest uruchamiany:

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
 12
Author: Johan Badenhorst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 09:36:06
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
 3
Author: Florent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 08:25:37

Jeśli chcesz uzyskać ograniczenie według nazw kolumn lub tabel lub chcesz uzyskać wszystkie ograniczenia w bazie danych, poszukaj innych odpowiedzi. Jeśli jednak szukasz dokładnie tego, co pytanie zadaje, a mianowicie, aby "sprawdzić, czy dane ograniczenie domyślne istnieje ... przez nazwę ograniczenia " , wtedy jest o wiele łatwiejszy sposób.

Oto przyszłościowa odpowiedź, która w ogóle nie używa tabel sysobjects ani innych sys:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END
 3
Author: ErikE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-24 19:00:35

Jest kolumną COLUMN_DEFAULT INFORMATION_SCHEMA.Kolumny czego szukasz?

 2
Author: user12861,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 20:38:17
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 
 1
Author: user3059720,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 01:28:44

Nie wydaje mi się, aby było to w INFORMATION_SCHEMA - prawdopodobnie będziesz musiał użyć sysobjects lub powiązanych przestarzałych tabel/widoków.

Można by pomyśleć, że w INFORMATION_SCHEMA będzie taki typ.TABLE_CONSTRAINTS, ale nie widzę żadnego.

 0
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 21:26:54

Prawdopodobnie dlatego, że w niektórych innych bazach danych SQL "domyślne ograniczenie" nie jest tak naprawdę ograniczeniem, nie znajdziesz jego nazwy w " INFORMATION_SCHEMA.TABLE_CONSTRAINTS", więc najlepszym rozwiązaniem jest " INFORMATION_SCHEMA.Felietony " jak już wspominali inni.

(SQLServer-tutaj)

Jedynym powodem, dla którego przychodzi mi na myśl, kiedy musisz znać nazwę "domyślnego ograniczenia", jest to, że SQLServer nie obsługuje komendy "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT...". Ale wtedy jesteś już w niestandardowej strefie I ty musisz użyć specyficznych dla produktu sposobów, aby uzyskać to, czego potrzebujesz.

 0
Author: Milen A. Radev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 00:03:53

Jak o użyciu kombinacji CHECK_CONSTRAINTS i CONSTRAINT_COLUMN_USAGE:

    select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name
          from information_schema.columns columns
             inner join information_schema.constraint_column_usage usage on 
                  columns.column_name = usage.column_name and columns.table_name = usage.table_name
             inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name
    where columns.column_default is not null
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-26 21:06:25

Używam folllowing script do odzyskiwania wszystkich domyślnych (sp_binddefaults) i wszystkich domyślnych ograniczeń za pomocą następujących skryptów:

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 = ''
 0
Author: Mirec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 09:22:15

Widok katalogu obiektów : sys . default_constraints

Widoki schematów informacyjnych INFORMATION_SCHEMA są zgodne z ANSI, ale domyślne ograniczenia nie są częścią standardu ISO. Microsoft SQL Server udostępnia widoki katalogów systemu do uzyskiwania informacji o metadanych obiektów SQL Server.

sys.default_constraints widok katalogu systemu używany do uzyskiwania informacji o domyślnych ograniczeniach.

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
Author: eigenharsha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 11:00:50