Ich habe einen Tabellenadministrator mit nur einer Spalte, adminId, die der Primärschlüssel ist. Aufgrund von Geschäftsregeln muss es so sein.
Ich möchte ein für alle Mal verstehen, wie ich gespeicherte Prozeduren schreiben kann, die Werte in solche Tabellen einfügen. Ich verwende SQL Server und T-SQL und habe versucht, SCOPE_IDENTITY () zu verwenden, aber das funktioniert nicht, da die Tabelle INSERT_IDENTITY auf false oder off hat.
Ich möchte wirklich keinen Dummy-Wert einfügen, nur um eine neue Zeile einfügen zu können. Vielen Dank!
Antworten:
Wenn Sie eine Spalte haben, die eine IDENTITÄT ist, tun Sie dies einfach
Wenn Sie keine Identität haben, können Sie diese dann festlegen? Dies ist der beste Weg .. und verwenden Sie die SQL oben.
Wenn nicht, möchten Sie eine neue Zeile einfügen
Anmerkungen:
quelle
Sie müssen die IDENTITY_INSERT zu Ihrer select-Anweisung hinzufügen:
Wenn Sie fertig sind, denken Sie daran
Hier ist eine gute Beschreibung der Funktionsweise von BOL: http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx
quelle
@Phil: Meinst du nicht, dass deine Tabelle zwei (2) Spalten hat, die automatisch inkrementierende PK-Spalte und eine AdminName-Spalte? Wenn der AdminName nur eine Spalte enthält, ist der AdminName die PK, und Sie können eine Zeichenfolge natürlich nicht automatisch inkrementieren. Erwarten die Geschäftsregeln, dass Sie einen vollqualifizierten Windows-Benutzernamen zum Primärschlüssel machen? Das wäre sinnvoll und sinnvoll, da Sie dann keinen alternativen eindeutigen Index für die Spalte AdminName benötigen würden.
Wenn Ihre Tabelle jedoch zwei Spalten enthält, nicht eine:
In SQLServer ist die automatische Inkrementierung Teil der Tabellen- / Spaltendefinition. Sie definieren die Spalte als Ganzzahl und machen sie dann auch zu einer Identitätsspalte, wobei Sie das Inkrement angeben, normalerweise 1, aber es kann 2 oder 5 oder 10 oder was auch immer sein. Um eine Zeile einzufügen, fügen Sie einfach die anderen Spaltenwerte ein und tun nichts mit der PK-Spalte:
Ihr gespeicherter Prozess, der die Einfügung ausführt, kann SCOPE_IDENTITY zu einem RETURN-Wert machen, oder SCOPE_IDENTITY kann als OUT-Parameter an den Client zurückgegeben werden.
PS SCOPE_IDENTITY () gibt den zuletzt generierten automatisch inkrementierten Identitätswert im aktuellen Bereich zurück. Es wird nicht der nächste Identitätswert generiert.
BEARBEITEN:
Vermutlich enthält Ihre Administratortabelle eine Reihe von Administratoren. Wenn jedoch keine anderen Spalten als die ganzzahlige Primärschlüsselspalte vorhanden sind, können die Administratoren nicht identifiziert werden. Sie können sie nur voneinander unterscheiden. Das bringt dich überhaupt nicht weit. Aber wenn Ihre Administrator-Tabelle eine der folgenden Strukturen hatte:
ODER
Sie könnten auf die Administratortabelle aus anderen Tabellen verweisen, und die Fremdschlüssel wären BEDEUTEND. Und genau das fehlt einer Tabelle, die aus einer einzelnen Ganzzahlspalte besteht - Bedeutung.
Mit zwei Spalten können Sie dann eine gespeicherte Prozedur ausführen lassen:
und Ihr Client-Programm würde als Rückgabewert die automatisch inkrementierte ID zurückerhalten, die automatisch generiert und der neu eingefügten Zeile zugewiesen wurde. Dieser Ansatz ist die übliche Praxis, und ich würde sogar sagen, dass er als "Best Practice" gilt.
PS Sie erwähnen, dass Sie nicht wussten, wie man "einen Wert einfügt", wenn Sie "nichts einzufügen hatten". Da gibt es einen Widerspruch. Wenn Sie nichts einzufügen haben, warum einfügen? Warum würden Sie beispielsweise einen neuen KUNDENDATEN erstellen, wenn Sie absolut nichts über den Kunden wissen? Nicht ihr Name, ihre Stadt, ihre Telefonnummer, nichts?
quelle
But an autoincrementing integer whose autoincrementation must be disabled is a poor solution.
Sie benötigen lediglich eine parallele Tabelle mit einer Eins-zu-Eins-Beziehung zur Benutzertabelle. In dieser Tabelle erstellen Sie eine Bitspalte. Wenn diese Spalte wahr ist, bedeutet dies, dass der Benutzer-admin hat. Reinigen. Standard. Design.