Я пытаюсь использовать написанную мной хранимую процедуру, которая должна создать новый проект в таблице «Project». Он также проверяет, есть ли в таблице «Сохраненный проект» сохраненный проект с тем же идентификатором, и удаляет его после успешного создания.
Также предполагается, что переданный user_id имеет разрешение на создание проект (т.е. не является стандартным пользователем).
Вот хранимая процедура:
USE [BugMate_DB]
GO
/****** Object: StoredProcedure [dbo].[create_project] Script Date: 2020-07-08 11:05:30 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[create_project]
@project_name NVARCHAR(40),
@date_started DATETIME,
@project_description NVARCHAR(400),
@project_status NVARCHAR(40),
@project_active BIT,
@next_iteration_date DATETIME,
@created_by_userid INT,
@project_leader_id INT,
@save_id INT = NULL
AS
SET NOCOUNT ON
BEGIN
IF (SELECT TOP 1 roleid from user_info WHERE userid = @created_by_userid) = 'SDU'
BEGIN
RAISERROR ('User does not have permission to do this action. Please contact a manager or administrator to resolve this issue.', 16, 1)
END
ELSE
BEGIN
INSERT INTO project(project_name, date_started, project_description, project_status, project_active, next_iteration_date, created_by_userid, project_leader_id)
VALUES (@project_name, @date_started, @project_description, @project_status, @project_active, @next_iteration_date, @created_by_userid, @project_leader_id)
IF @@ERROR <> 0
BEGIN
RAISERROR('Project creation insert failed.', 16, 1)
END
ELSE
BEGIN
IF @save_id != NULL
BEGIN
IF EXISTS (SELECT TOP 1 save_id FROM saved_project WHERE save_id = @save_id)
BEGIN
DELETE FROM saved_project WHERE save_id = @save_id
END
END
END
END
IF @@ERROR <> 0
BEGIN
RAISERROR('Error creating project', 16, 1)
END
ELSE
BEGIN
INSERT INTO project_member(userid, project_number)
VALUES (@created_by_userid, (SELECT project_number FROM project WHERE created_by_userid = @created_by_userid))
END
END
Проблема в том, что я получаю эту ошибку при выполнении моего SP:
Сообщение 512, уровень 16, состояние 1, процедура create_project, строка 48 Подзапрос вернул более 1 значения. Это не разрешено, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.
Я не уверен, почему любой из моих подзапросы будут возвращать несколько значений.
Вот значения, которые я пытаюсь передать:
USE [BugMate_DB]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[create_project]
@project_name = N'Test',
@date_started = N'12/25/2015 12:00:00 AM',
@project_description = N'This is a test.',
@project_status = N'InDevelopment',
@project_active = 1,
@next_iteration_date = N'12/25/2015 12:00:00 AM',
@created_by_userid = 19,
@project_leader_id = 19,
@save_id = NULL
SELECT 'Return Value' = @return_value
GO
Я попытался использовать «TOP 1», чтобы попытаться вернуть одно значение, но похоже, это не то, что я ищу.
Насколько я могу судить, это тоже не проблема присоединений.
Я новичок в SQL Сервер, поэтому любая помощь будет принята с благодарностью.