Reden Rodriguez Ответов: 1

Получение null при вставке данных с помощью scope_identity


Здравствуйте, ребята, можно ли вставить данные дважды? в одной хранимой процедуре данных? я имею в виду, если у меня есть кодсотрудника, имя и отчество должны быть вставлены в таблицу employee и у меня есть еще одно высказывание в мой хранимой процедуры, я хочу, чтобы вставить тот же номер сотрудника в таблице employeeImages, imagesId,кодсотрудника,employeeImages, это будет нормально? потому что я получаю null, но я могу вставить изображение.

кстати, вот мой код.
USE [northwind]
GO
/****** Object:  StoredProcedure [dbo].[spCreateAttrition]    Script Date: 01/21/2019 1:14:37 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[spCreateAttrition]
	 @EmployeeID bigint,
	 @WaveNumber int,
	 @LastName varchar(50),
	 @FirstName varchar(50),
	 @MiddleName varchar(50),
	 @Address varchar(50),
	 @Region varchar(50),
	 @City varchar(50),
	 @ZipCode varchar(50),
	 @ContactNumber int,
	 @EmailAddress varchar(50),
	 @ContactPerson varchar(50),
	 @ContactPnumber int,
	 @ImmediateSupervisor varchar(50),
	 @HireDate date,
	 @StartDate date,
	 @RegularDate date,
	 @Status varchar(50),
	 @AttritionReason varchar(50),
	 @VoluntaryExpiration varchar(50),
	 @NonVoluntary varchar(50),
	 @Remarks varchar(50),
	 @EmployeePicture image
AS
BEGIN
	DECLARE @imageID int

	IF NOT EXISTS(SELECT * FROM employeeAttritions WHERE EmployeeID = @EmployeeID AND WaveNumber = @WaveNumber)
		BEGIN
			INSERT INTO employeeAttritions(EmployeeID, WaveNumber, LastName, FirstName, MiddleName, Address, Region, City, ZipCode,
						ContactNumber, EmailAddress,ContactPerson,ContactPnumber,ImmediateSupervisor,
						HireDate,StartDate,RegularDate,Status,AttritionReason,VoluntaryExpiration,NonVoluntary,Remarks)
				VALUES (@EmployeeID, @WaveNumber, @LastName, @FirstName,@MiddleName, @Address, @Region, @City,@ZipCode,
						@ContactNumber,@EmailAddress,@ContactPerson,@ContactPnumber,@ImmediateSupervisor,@HireDate,
						@StartDate,@RegularDate,@Status,@AttritionReason,@VoluntaryExpiration,@NonVoluntary,@Remarks)

			SET @EmployeeID = SCOPE_IDENTITY()
		 END
	ELSE
		RAISERROR('EmployeeID (%s) already exists', 16, 0, @EmployeeID)

	IF NOT EXISTS(SELECT * FROM attritionImages WHERE @imageID = imageID AND EmployeeID = @EmployeeID)
		BEGIN
			INSERT INTO attritionImages (EmployeeID, EmployeePicture)
				VALUES (@EmployeeID, @EmployeePicture)

			SET @imageID = SCOPE_IDENTITY()
		END
	ELSE
		RAISERROR('ImageID (%s) already exists', 16, 0, @imageID)
END


Что я уже пробовал:

я планирую изменить это в заявление join, но я все еще хочу, чтобы это сработало.

1 Ответов

Рейтинг:
2

OriginalGriff

Да, ты можешь. Но... только не так.
Ваш код пытается вставить значение в БД:

INSERT INTO employeeAttritions(EmployeeID, WaveNumber, ...) VALUES (@EmployeeID, @WaveNumber, ...)
А затем считайте идентификационное значение из системы сразу же после этого:
SET @EmployeeID = SCOPE_IDENTITY()
Но если вы можете вставить значение, то это не поле IDENTITY, поэтому нет никакого значения SCOPE_IDENTITY для чтения обратно, поэтому вы получаете NULL, если только в строке нет другого поля, содержащего значение IDENTITY (но это означает, что значение EmployeeID может быть дублировано, что было бы очень странно).

Вы не можете передать EmployeeID из вашего кода презентации и ожидать, что все будет работать: вы никогда не должны пытаться заранее назначать значения, так как это всегда будет давать сложные и "случайные" ошибки в производстве, которые очень трудно отследить, но которые полностью испортят вашу базу данных.

Остановитесь и подумайте о том, что вы пытаетесь сделать!