Re: Spalte mit Default-Constraint löschen




Hallo Jürg,

Jürg Danuser schrieb:

> In der Newsgroup der Datenbank-Entwickler konnte mir niemand helfen,
> vielleicht weiss es hier jemand:

Da bin ich die letzten Tage nicht reingekommen...

Bei einer Umsetzung mit ADO.NET kannst Du Dir die Variable
@sql und das EXEC schenken, und die Befehle via StringBuilder
erstellen und mit ExecuteNonQuery() ausführen.

Ich habe eine Tabelle in der eine Spalte gelöscht werden muss. Diese
Spalte hat bei einigen Datenbanken einen Defaultwert bei anderen
nicht. Zusätzlich schwierig wirds, da der Name für den Defaultwert
dynamisch generiert wurde, das heisst von DB zu DB ist die
Bezeichnung anders.

Für die Zukunft wäre es besser solche Einschränkungen mit Namen
anzugeben, siehe im Beispiel für die Spalte Daten1

Ich brauche nun ein SQL-Script, welches diese Spalte löscht. Gibt es
eine Möglichkeit eine Spalte zu löschen und es werden alle abhängigen
Constraints ebenfalls mitgelöscht?

Unten ein Skript für SQL SErver 2005 und später.
Für ältere Versionen müsste mit syscolumns und sysobjects
Tabellen gearbeitet werden - Skript bei Bedarf.

Gruß Elmar

--

DROP TABLE dbo.Tabelle
GO

CREATE TABLE dbo.Tabelle
(
id int not null identity(1, 1) PRIMARY KEY,

daten1 nvarchar(40) NOT NULL
-- benannte Default (DF_Tabelle_Spalte)
CONSTRAINT DF_Tabelle_Daten1 DEFAULT (N'daten1'),

daten2 nvarchar(40) NOT NULL DEFAULT (N'daten2')
)
GO

DECLARE @tablename nvarchar(259)
DECLARE @columnname sysname
DECLARE @defaultname sysname

-- Tabelle hier bereits mit Schema + Quotes
SET @tablename = N'[dbo].[Tabelle]'
SET @columnname = N'daten2'

SELECT @defaultname = dc.name
FROM sys.default_constraints AS dc
INNER JOIN sys.columns AS c
ON dc.object_id = c.default_object_id
WHERE c.object_id = OBJECT_ID(@tablename)
AND c.name = @columnname


DECLARE @sql nvarchar(max)

-- DEFAULT löschen
IF @defaultname IS NOT NULL
BEGIN
PRINT 'Default: ' + @defaultname

SET @sql = N'ALTER TABLE ' + @tablename
+ N' DROP CONSTRAINT ' + QUOTENAME(@defaultname)
-- PRINT @sql
EXEC (@sql)
END
-- Spalte löschen
SET @sql = N'ALTER TABLE ' + @tablename
+ N' DROP COLUMN ' + QUOTENAME(@columnname)
-- PRINT @sql
EXEC (@sql)

-- Ergebnis
EXEC sp_help @tablename
GO

.



Relevant Pages

  • Re: Update databases
    ... Compares if all tables in one database have analog in second ... declare @sqlStr varchar ... exec ('declare @Name sysname select @Name=name from ... -- ##CompareStr - will be used to pass comparing strings into dynamic script ...
    (microsoft.public.sqlserver.programming)
  • =?Utf-8?Q?Re:_SQL_-_Wie_mit_Parameter_=28Str?= =?Utf-8?Q?ing=29__NULL_=C3=BCbergeben=3F?
    ... unique index nur eine Spalte, ... Die nullable Spalte ... aus der Tabelle entfernen, eine neue Tabelle anlegen, die diese Werte enthält ... (NOT NULL) ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Re: IN(@variable) clause and Table Data Type variable
    ... > separated character values all enclosed in pairs of single quotes. ... > also need to use a Table data type variable which raises error when EXEC ... > command is run. ... > -- declare and set Table variable ...
    (microsoft.public.sqlserver.programming)
  • Re: In(@variable) clause and TABLE datatype variable
    ... > separated character values all enclosed in pairs of single quotes. ... > also need to use a Table data type variable which raises error when EXEC ... > command is run. ... > -- declare and set Table variable ...
    (microsoft.public.sqlserver.programming)
  • Re: Disable Replication, remove rowguide-column?
    ... exec sp_configure N'allow updates', 1 ... DECLARE @username varchar ... FETCH NEXT FROM list_triggers INTO @name, ... create table syssubscriptions (artid int, srvid smallint, dest_db sysname, ...
    (microsoft.public.sqlserver.replication)