wake-up-neo.com

Wie lässt sich ein Standardwert oder eine ähnliche Einschränkung in T-SQL löschen?

Ich kenne die Syntax:

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

aber wie lösche ich die Standardeinschränkung, wenn ich deren Namen nicht kenne? (Das heißt, es wurde zur CREATE TABLE-Zeit automatisch generiert.)

63
Frank Krueger

Wenn Sie dies manuell tun möchten, können Sie es mithilfe von Management Studio finden (unter dem Knoten Constraints in der Tabelle). 

Um dies mit SQL zu tun:

  • Wenn es sich bei den Einschränkungen um Standardeinschränkungen handelt, können Sie sys.default_constraints verwenden, um sie zu finden:

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
    FROM sys.default_constraints ORDER BY TableName, ConstraintName
    
  • Wenn Sie auch nach anderen Einschränkungen suchen (prüfen, eindeutig, Fremdschlüssel, Standardwert, Primärschlüssel), können Sie sysconstraints verwenden:

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
    FROM sysconstraints ORDER BY TableName, ConstraintName
    

Sie sagen nicht, welche Version von SQL Server Sie verwenden. Die obigen Ausführungen funktionieren sowohl für SQL 2005 als auch für SQL 2008.

45
adrianbanks

Sie können diesen Code verwenden, um dies automatisch durchzuführen:

DECLARE @tableName VARCHAR(MAX) = '<MYTABLENAME>'
DECLARE @columnName VARCHAR(MAX) = '<MYCOLUMNAME>'
DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name 
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) 
AND PARENT_COLUMN_ID = (
    SELECT column_id FROM sys.columns
    WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE '[email protected]+' DROP CONSTRAINT ' + @ConstraintName)

Ersetzen Sie einfach <MYTABLENAME> und <MYCOLUMNNAME> entsprechend.

58
Polemarch

Oder Sie finden es in der Katalogsicht sys.check_constraints.

4
Alex_L

Sie können den Namen der Einschränkung anhand von sp_help [Tabellenname] ermitteln und dann nach Namen ablegen.

Oder Sie können dies wahrscheinlich über Management Studio tun.

3
Tetraneutron

Verwenden Sie für eine einzelne Tabelle und Spalte in einer einzelnen Zeile Folgendes

declare @sql nvarchar(max); set @sql = ''; SELECT @sql+='ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT ' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = 'YOURTABLENAME'AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = 'YOURTABLENAME' and COLUMN_NAME = 'YOURCOLUMNNAM'))) + ';'; EXEC sp_executesql @sql;

Wenn Sie mehrere Einschränkungen für die Spalte haben, müssen Sie die Einschränkung, nach der Sie suchen, unterscheiden. Wenn Sie jedoch nur eine Standardeinschränkung haben, wird dies der Trick sein.

Schauen Sie sich die anderen in information_schema verfügbaren Spalten an, damit Sie weiter differenzieren können.

1
sweetfa

Hier folgt meine eigene Version, die alle abhängigen Einschränkungen aufhebt - Standardeinschränkung (falls vorhanden) und alle betroffenen Checkeinschränkungen (wie der SQL-Standard andeutet und wie einige andere Datenbanken dies scheinen)

declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
   select object_id table_id, column_id column_position
      from sys.columns where object_id is not null and object_id = object_id('TableName') and name = 'ColumnToBeDropped'
)
select @constraints = coalesce(@constraints, 'constraint ') + '[' + name + '], '
from sysobjects 
where (
  -- is CHECK constraint
  type = 'C' 
  -- dependeds on the column
  and id is not null
  and id in (
      select object_id --, object_name(object_id)
      from sys.sql_dependencies, table_id_column_position 
      where object_id is not null
      and referenced_major_id = table_id_column_position.table_id
      and referenced_minor_id = table_id_column_position.column_position
    )
) OR (
  -- is DEFAULT constraint
  type = 'D'
  and id is not null
  and id in (
    select object_id
    from sys.default_constraints, table_id_column_position
     where object_id is not null
     and parent_object_id = table_id_column_position.table_id
     and parent_column_id = table_id_column_position.column_position
  )
);
set @sql = 'alter table TableName drop ' + coalesce(@constraints, '') + ' column ColumnToBeDropped';
exec @sql

(Achtung: Sowohl TableName als auch ColumnToBeDropped erscheinen zweimal im obigen Code.)

Dies funktioniert, indem ein einzelner ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped erstellt und ausgeführt wird.

0
Piotr Findeisen