У меня есть следующий параметризованный SQL-запрос, который вставляет данные в таблицу, получает (автоматически увеличивается) значение Id новой строки, а затем вставляет это новое значение в другую таблицу:
DECLARE @engId_newtable TABLE(engId INT);
DECLARE @engId_new INT;
INSERT INTO eng (locationTypeId, engNumb, projectId, engTypeId, capacity, cylNo, employeeId, bore, stroke, crankOffset, rodLength, cr, crankThrow, pinOffset, engDesc)
OUTPUT INSERTED.engId INTO @engId_newtable
SELECT a.locationTypeId, @engNumb, b.projectId, c.engTypeId, @capacity, @cylNo, d.employeeId, @bore, @stroke, @crankOffset, @rodLength, @cr, @crankThrow, @pinOffset, @engDesc
FROM dbo.locationType AS a,dbo.project AS b,dbo.engType AS c,dbo.employees AS d
WHERE a.locationType = @locationType AND b.projectCode = @projectCode AND b.engineType = @engineType AND c.engType = @engType AND d.userName = @userName ;
SELECT @engId_new = engId FROM @engId_newtable;
INSERT INTO oil (engId, oilQuantity, oilTypeId)
SELECT @engId_new, @oilQuantity, a.oilTypeId
FROM dbo.oilType AS a
WHERE a.oilManufacturer = @oilManufacturer AND a.oilRange = @oilRange AND a.oilGrade = @oilGrade ;
Запрос отлично работает при выполнении в SQL Server Management Studio (SSMS), но когда я пытаюсь запустить его с помощью моего проекта ASP.NET Core C # (Razor Pages), он завершается неудачно со следующей ошибкой:
System.Data.SqlClient.SqlException: 'Невозможно вставить значение NULL в
столбец 'engId', таблица 'TestEng.dbo.oil'; столбец не допускает пустых значений.
Вставить не удается. Заявление было прекращено. '
Похоже, что команда OUTPUT INSERTED
не работает. Я также пытался использовать SELECT @engId_new = SCOPE_IDENTITY()
и даже @@IDENTITY
, но они также возвращают ноль и выдают ту же ошибку.
У меня есть похожие запросы (с использованием OUTPUT INSERTED
) в других областях моего проекта, которые работают нормально. Этот запрос также работал корректно до сегодняшнего дня, когда мы изменили сервер, на котором работает база данных SQL - может быть, мне нужно изменить некоторые параметры базы данных / таблицы?
Любая помощь очень ценится, я действительно в растерянности. Благодаря.
РЕДАКТИРОВАТЬ: показывает, как выполняется запрос
Запрос построен программно - я знаю, что функции построения запросов работают, так как все остальные мои запросы работают нормально - запрос, который я пытаюсь выполнить, точно такой, как показано здесь (он возвращается конструктором запросов в виде одной строки):
"DECLARE @engId_newtable TABLE(engId INT); DECLARE @engId_new INT; INSERT INTO eng (locationTypeId, engNumb, projectId, engTypeId, capacity, cylNo, employeeId, bore, stroke, crankOffset, rodLength, cr, crankThrow, pinOffset, engDesc) OUTPUT INSERTED.engId INTO @engId_newtable SELECT a.locationTypeId, @engNumb, b.projectId, c.engTypeId, @capacity, @cylNo, d.employeeId, @bore, @stroke, @crankOffset, @rodLength, @cr, @crankThrow, @pinOffset, @engDesc FROM dbo.locationType AS a,dbo.project AS b,dbo.engType AS c,dbo.employees AS d WHERE a.locationType = @locationType AND b.projectCode = @projectCode AND b.engineType = @engineType AND c.engType = @engType AND d.userName = @userName ;SELECT @engId_new = engId FROM @engId_newtable; INSERT INTO oil (engId, oilTypeId) SELECT @engId_new, a.oilTypeId FROM dbo.oilType AS a WHERE a.oilManufacturer = @oilManufacturer AND a.oilRange = @oilRange AND a.oilGrade = @oilGrade ;"
Функция выполнения запроса, вызываемая из модели бритвенной страницы, запрос и соединение передаются как параметры:
public void ExecuteVoid(SqlConnection con, string query, List<SqlColumn> columns, List<SqlFilter> filters)
{
SqlCommand cmd = new SqlCommand(query, con);
Parameterize(cmd, columns, filters);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
Функция Parameterize
просто добавляет все соответствующие параметры в запрос. Опять же, как и функция построителя запросов, я знаю, что она работает, потому что все остальные мои запросы выполняются как положено.
РЕДАКТИРОВАТЬ 2: SQL Server Profiler
Ниже показано изображение, показывающее все события, относящиеся к этому запросу, которые я вижу в SQL Server Profiler:
Все части запроса записаны, как и ожидалось, все параметры присутствуют, но запрос все еще не выполнен.