Как уже упоминалось, несколько раз, это должно быть 3 отдельных SP, поэтому вам нужны только параметры, необходимые для этой операции:
CREATE PROC dbo.Review_Delete @id int AS
BEGIN
DELETE FROM dbo.review
WHERE id = @id;
END;
GO
CREATE PROC dbo.Review_Insert @pID int, @email nvarchar(255), @review nvarchar(3000), @RefURL nvarchar(2083), @RefID nvarchar(100) AS
BEGIN
INSERT INTO dbo.review(pID, email, review, refURL, refID)
OUTPUT inserted.uID --This seems like an OUTPUT parameter might be better, as you insert a single row
VALUES(@pID, @Email, @review, @RefURL, @RefID);
END;
GO
CREATE PROC dbo.Review_Update @id int, @pID int, @email nvarchar(255), @review nvarchar(3000), @RefURL nvarchar(2083), @RefID nvarchar(100) AS
BEGIN
UPDATE dbo.review
SET pID = @pID,
email = @email,
review = @review,
refURL = @refURL,
refID = @refID
WHERE ID = @ID;
END;
GO
Обратите внимание, что я никогда не объявляю параметр @cDate
, так как выне используйте его один раз в своем SP.
Если по какой-то действительно странной причине вам действительно нужен один SP, то создайте другие и вызывайте их динамически;только передавая параметры, которые вы передали в «мастер» ИП «детям».Я, однако, не рекомендую этот, и вы должны просто назвать их правильными в первую очередь:
CREATE PROC Review_Operation @Operation char(6), --No need for this to be an nvarchar, or 50 characters, delete, insert and update are all 6 characters in length and contain no unicode characters
@ID int = NULL, @pID int = NULL, @email nvarchar(255) = NULL, @review nvarchar(3000) = NULL, @RefURL nvarchar(2083) = NULL, @RefID nvarchar(100) = NULL AS
BEGIN
--Because they are all NULL we're going to use Dynamic SQKL to only pass parameters will a value to force the error
DECLARE @SQL nvarchar(MAX),
@Params nvarchar(MAX);
IF @Operation = 'Delete' BEGIN
SET @SQL = N'EXEC Review_Delete ' + CASE WHEN @ID IS NOT NULL THEN N'@id' ELSE N'' END + N';';
SET @Params = N'@ID int';
EXEC sp_executesql @SQL, @Params, @ID;
END ELSE IF @Operation = 'Insert' BEGIN
SET @SQL = N'EXEC Review_Insert ' + STUFF(CASE WHEN @pID IS NOT NULL THEN N',@pID = @pID' ELSE N'' END +
CASE WHEN @email IS NOT NULL THEN N',@email = @email' ELSE N'' END +
CASE WHEN @review IS NOT NULL THEN N',@review = @review' ELSE N'' END +
CASE WHEN @RefURL IS NOT NULL THEN N',@RefURL = @RefURL' ELSE N'' END +
CASE WHEN @RefID IS NOT NULL THEN N',@RefID = @RefID' ELSE N'' END,1,1,N'') + N';';
SET @Params = N'@pID int, @email nvarchar(255), @review nvarchar(3000), @RefURL nvarchar(2083), @RefID nvarchar(100)';
EXEC sp_executesql @SQL, @Params, @pID, @email, @review, @RefURL, @RefID;
END ELSE IF @Operation = 'Update' BEGIN
SET @SQL = N'EXEC Review_Update ' + STUFF(CASE WHEN @ID IS NOT NULL THEN N',@ID = @ID' ELSE N'' END +
CASE WHEN @pID IS NOT NULL THEN N',@pID = @pID' ELSE N'' END +
CASE WHEN @email IS NOT NULL THEN N',@email = @email' ELSE N'' END +
CASE WHEN @review IS NOT NULL THEN N',@review = @review' ELSE N'' END +
CASE WHEN @RefURL IS NOT NULL THEN N',@RefURL = @RefURL' ELSE N'' END +
CASE WHEN @RefID IS NOT NULL THEN N',@RefID = @RefID' ELSE N'' END,1,1,N'') + N';';
SET @Params = N'@id int,@pID int, @email nvarchar(255), @review nvarchar(3000), @RefURL nvarchar(2083), @RefID nvarchar(100)';
EXEC sp_executesql @SQL, @Params, @ID, @pID, @email, @review, @RefURL, @RefID;
END;
END;
GO