Ich habe einen Primärschlüssel, den ich nicht automatisch inkrementieren möchte (aus verschiedenen Gründen), und so suche ich nach einer Möglichkeit, dieses Feld einfach zu erhöhen, wenn ich INSERT. Ich meine einfach ohne gespeicherte Prozeduren und ohne Trigger, also nur eine Reihe von SQL-Befehlen (vorzugsweise einen Befehl). HierMöglich, ein manuelles Inkrement mit nur einfachem SQL INSERT zu implementieren?
ist, was ich versucht habe, so weit:
BEGIN TRAN
INSERT INTO Table1(id, data_field)
VALUES ((SELECT (MAX(id) + 1) FROM Table1), '[blob of data]');
COMMIT TRAN;
* Data abstracted to use generic names and identifiers
Wenn jedoch ausgeführt, der Befehl Fehler und sagte, dass
„Unterabfragen nicht in diesem Kontext erlaubt sind nur skalare Ausdrücke. sind erlaubt "
Also, wie kann ich das tun/was mache ich falsch?
EDIT: Da es als Gegenleistung darauf hingewiesen wurde, um die Tabelle in der bereits mindestens 1 Zeile garantiert eingefügt ist zu haben.
Warum würde es Kollisionen geben? Solche Dinge werden von der Transaktion behandelt, ja? Wo kämen die Deadlocks hinzu? – cdeszaq
nicht, wenn Sie unter der Standardtransaktionsebene laufen (lesen Sie, verpflichtet), was verbietet zwei Threads, den gleichen maximalen Wert zu lesen? – SQLMenace
Deadlocks können vermieden werden, indem Sie den 'Holdlock' Hinweis weglassen –