2016-07-12 8 views
0

Problem beim Ändern von PrimaryKey in Tabelle.Fehler beim Ändern von PrimaryKey (Einschränkung) in Tabelle

Fehler: "IDENTITY-Attribut konnte nicht in NULL-Spalte erstellt werden."

Einzelheiten:

  • "update" ist eine zählbare der Klasse, die von Datasource und IClonable
  • "Tisch" eine Klasse von Datasource
abgeleitet ist

-Code abgeleitet wird :

foreach (var u in update) 
{ 
    myList.Add(string.Format("alter table [{0}] alter column {1} {2} {3};", table.Name, u.Name, (u.IsPrimary || u.IsAutoIncrement) ? "not null" : "null")); 
} 

Ich habe auch versucht, alle PrimaryKeys wie diese zu entfernen:

foreach (var u in update.Where(x => x.IsPrimary)) 
{  
    myList.Add(string.Format("alter table [{0}] drop constraint {1}", table.Name, u.Name)); 
} 

Aber es sagt, dass ich aktuelles Element bin nicht versuchen, eine Einschränkung zu setzen, wie PrimaryKey ist.

auch, dass ich erwähnt habe, wenn ich die if Aussage auf diese Weise (und umgekehrt) zu ändern:

(u.IsPrimary || u.IsAutoIncrement) ? "null" : "not null";

, wenn ich versuche zu ändern zurück Primärschlüssel, es funktioniert. Ich meine, wenn ich zuerst den Primärschlüssel ändere, dann gibt es eine Ausnahme, dann ändere ich if-Anweisung und ändere dann PrimaryKey, der das Geschäft macht.

Update: Jetzt weiß ich definitiv, dass ich einen Constraint-Namen finden muss, den ich entfernen möchte, in meinem Fall wird es die Standard-ID sein (es kann mit sys-Schema gemacht werden, aber ich don ' Ich weiß, wie man es benutzt), dann muss ich es fallen lassen, und schließlich muss ich eine neue Einschränkung mit neuem Namen erzeugen.

Antwort

0

Ergebnis query:

declare @CONSTRAINTNAME varchar(128); 
declare @script nvarchar(max); 

select top 1 @CONSTRAINTNAME = t1.CONSTRAINT_NAME 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS t1 
where CONSTRAINT_TYPE = 'PRIMARY KEY' and upper(t1.TABLE_NAME) = @tableName; 

set @script = N'alter table [' + @tableName + N'] drop constraint [' + @CONSTRAINTNAME + N']'; 
exec sp_executesql @script 

set @script = N'alter table [' + @tableName + N'] add constraint [' + @tableName + '_' + @columnName + N'] primary key (['+ @columnName +'])'; 
exec sp_executesql @script 
Verwandte Themen