Ich habe eine Tabelle namens Mitarbeiter.Was ist der beste Ansatz zum Einfügen oder Aktualisieren einer ganzen Zahl mit gespeicherten Prozedur?
Diese Tabelle wird täglich mit einem geplanten Auftrag aus Active Directory aktualisiert.
Derzeit haben wir die folgende gespeicherte Prozedur, die überprüft, ob ein bestimmter Mitarbeiter in der Employee-Tabelle vorhanden ist.
Wenn ja, aktualisieren Sie die restlichen Mitarbeiterdatensätze in dieser Tabelle.
Wenn nicht, dann fügen Sie den Mitarbeiterdatensatz in diese Mitarbeitertabelle ein.
Um festzustellen, ob ein Mitarbeiter in der Employee-Tabelle vorhanden ist oder nicht, müssen die Mitarbeiter zuerst ihre employeeID eingeben. Dies ist keine automatisch generierte ID. Es wird zusammen mit dem Rest der Mitarbeiterdatensätze aus Active Directory in die Employee-Tabelle importiert, wenn dieser Mitarbeiterdatensatz in Active Directory vorhanden ist.
Das Problem, das wir haben, ist, dass wir nicht in der Employee-Tabelle einen neuen Mitarbeiterdatensatz einfügen können. Wir können den Datensatz auch nicht aktualisieren.
Wir hielten die Nachricht bekommen, dass:
kann nicht den Wert NULL in Spalte 'employeeID' einfügen, Tabelle 'Employees'; Spalte erlaubt keine Nullen. INSERT schlägt fehl. Die Anweisung wurde beendet.
Ich vermute, das Problem ist mit meiner gespeicherten Prozedur, aber nicht sicher, was das Problem ist.
Jede Hilfe wird sehr geschätzt.
Hier ist meine gespeicherte proc und der Code, den ich verwende, um zu versuchen, es aufzurufen.
ALTER PROCEDURE [dbo].[usp_Employees]
@FullName varchar(75),
@address varchar(100),
@city varchar(50),
@state varchar(50),
@zip varchar(50),
@eid int = 0 OUTPUT
AS
BEGIN
SET NOCOUNT ON;
begin tran
if exists (select * from Employees where employeeID = @eid)
begin
UPDATE Employees SET [empFullName] = @FullName
,[Address] = @address
,[City] = @city
,[State] = @state
,[Zip] = @zip where employeeID = @eid
end
else
begin
INSERT INTO [dbo].[Employees]
([empFullName]
,[Address]
,[City]
,[State]
,[Zip]
,[employeeID])
VALUES
(@FullName
,@address
,@city
,@state
,@zip
,@eid)
SET @eid = SCOPE_IDENTITY()
end
commit tran
END
int eid = 0;
SqlCommand cmd = new SqlCommand("usp_Employees", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FullName", txtfname.Text);
cmd.Parameters.AddWithValue("@address", txtfaddress.Text);
cmd.Parameters.AddWithValue("@city", txtcity.Text);
cmd.Parameters.AddWithValue("@state", ddlstates.SelectedValue);
cmd.Parameters.AddWithValue("@zip", txtfzip.Text);
SqlParameter employeeID = cmd.Parameters.Add("@eid", SqlDbType.Int);
employeeID.Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
eid = Convert.ToInt32(employeeID.Value);
Ich muss diese employeeID nach dem Einfügen oder zu aktualisieren und in andere Tabellen einfügen.
Ist MitarbeiterID eine Identitätsspalte? Oder ein Standard INT? Vermutlich möchten Sie, dass es einzigartig ist. @eid ist ein Ausgabeparameter, daher wird es Ihnen schwer fallen, es in der Einfügung zu verwenden, und Sie erhalten nicht die MAX ID oder ähnliches. Ihre Verwendung von SCOPE_IDENTITY schlägt vor, dass employeeID eine Identitätsspalte ist. Wenn dies der Fall ist, müssen Sie sie nicht in das INSERT aufnehmen, da SQL sich darum kümmert. – Leonidas199x
@ Leonidas199x, wie in meinem Original angegeben, ist es keine Auto-Inkrement-ID. Also, nein, es ist keine Identität. Es wird zusammen mit den übrigen Mitarbeiterdaten in die Tabelle Mitarbeiter importiert. – Kenny
@Kenny Warum verwenden Sie dann SCOPE_IDENTITY? Ich glaube nicht, dass das tut, was Sie denken, wenn Sie keine Identitätsspalte verwenden. – Leonidas199x