Frage

Ich versuche, zu testen, ob eine bestimmte Standardeinschränkung existiert. Ich will nicht die sysobjects Tabelle verwenden, aber die mehr Standard INFORMATION_SCHEMA.

Ich habe verwendet, um diese vor für Tabellen und Primärschlüssel zu überprüfen, aber ich sehe nicht, Standardeinschränkungen überall.

Sind sie es nicht? (Ich bin mit MS SQL Server 2000).

EDIT: Ich bin auf der Suche nach dem Namen des Zwangs bekommen

.
War es hilfreich?

Lösung

Wie ich es verstehe, Standardwert Zwänge sind nicht Teil der ISO-Norm, so erscheinen sie nicht in INFORMATION_SCHEMA. INFORMATION_SCHEMA scheint die beste Wahl für diese Art von Aufgabe, da es plattformübergreifende, aber wenn die Information nicht verfügbar ist, sollte man die Objektkatalogansichten verwenden (sys. *) Anstelle von Systemtabellenansichten, die in SQL Server sind veraltet 2005 und später.

Im Folgenden ist so ziemlich die gleiche wie @ user186476 Antwort. Es gibt den Namen der Standardwert Einschränkung für eine bestimmte Spalte. (Für Nicht-SQL Server-Benutzer, müssen Sie den Namen des Standard, um es fallen zu lassen, und wenn Sie nicht der Standard nennen selbst Zwang, SQL Server erstellt ein paar verrückten Namen wie „DF_TableN_Colum_95AFE4B5“. Um es einfacher zu ändern Ihr Schema in Zukunft immer explizit Ihre Zwänge nennen!)

-- 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'

Andere Tipps

Sie können mit folgenden wird die Ergebnisse noch weiter zu verengen, indem Sie den Tabellennamen und Spaltennamen Angabe, dass der Standard Constraint korreliert mit:

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'

Es scheint kein Standard-Constraint-Name in den Information_Schema Ansichten zu sein.

Verwendung SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name eine Standardeinschränkung von Namen zu finden

Das folgende Skript listet alle Standardeinschränkungen und die Standardwerte für die Benutzertabellen in der Datenbank, in der es ausgeführt wird:

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
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

Wenn Sie eine Einschränkung durch die Spalte oder Tabellennamen erhalten möchten, oder Sie wollen alle Einschränkungen in der Datenbank erhalten, suchen Sie nach anderen Antworten. Allerdings, wenn Sie gerade suchen, für genau das, was die Frage stellt, nämlich auf „Test, ob eine gegebene Standardeinschränkung existiert ... durch den Namen der Einschränkung“ , dann gibt es eine viel einfachere Art und Weise .

Hier ist eine zukunftssichere Antwort, die nicht die sysobjects oder andere sys Tabellen überhaupt nicht verwendet werden:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END

Ist die COLUMN_DEFAULT Spalte von INFORMATION_SCHEMA.COLUMNS, was Sie suchen?

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 

Ich glaube nicht, dass in der INFORMATION_SCHEMA ist - du musst wahrscheinlich sysobjects oder verwandte veraltete Tabellen / Ansichten verwenden

.

Sie würden denken, es wäre eine Art dafür in INFORMATION_SCHEMA.TABLE_CONSTRAINTS sein, aber ich weiß nicht ein sehen.

Wahrscheinlich, weil auf einigen der anderen SQL-Datenbanksystemen die „Standardeinschränkung“ ist nicht wirklich eine Einschränkung, werden Sie nicht ihren Namen in „INFORMATION_SCHEMA.TABLE_CONSTRAINTS“ finden, so ist die beste Wahl „INFORMATION_SCHEMA.COLUMNS“ als andere haben bereits erwähnt.

(SQLServer-Ignorant hier)

Der einzige Grund, ich mir vorstellen kann, wenn Sie die „Standardeinschränkung“ 'wissen, haben Namen, wenn SQLServer nicht "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..." Befehl nicht unterstützt. Aber dann sind Sie bereits in einer Nicht-Standard-Zone, und Sie haben die produktspezifischen Möglichkeiten nutzen, um das zu bekommen, was Sie brauchen.

Wie wäre es mit einer Kombination von CHECK_CONSTRAINTS und CONSTRAINT_COLUMN_USAGE mit:

    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

Ich bin mit folllowing Skript alle Standardeinstellungen (sp_binddefaults) und alle Standardeinschränkung mit folgenden Skripten retreive:

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 = ''

Objektkatalog Ansicht : sys.default_constraints

Das Informationsschema Ansichten INFORMATION_SCHEMA sind ANSI-konform, aber die Standardeinschränkungen sind nicht Bestandteil der ISO-Norm. Microsoft SQL Server bietet Systemkatalogsichten für den Zugriff auf Informationen zu SQL Server-Objekt-Metadaten.

sys.default_constraints Systemkatalogsicht zu bekommen Sie die Informationen über Standardeinschränkungen verwendet.

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top