Возникла проблема с хранимой процедурой SQL-Server - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть хранимая процедура, с которой у меня возникают некоторые проблемы.

Я пытаюсь найти свою таблицу GOTWVotes, и если VotedBy не проголосовал, прежде чем написать голосованиев таблицу (это работает), однако, если VotedBy проголосовал, прежде чем не записывать в таблицу и вернуть VoteCount как 1.

Хотя он не записывает в таблицу, когда существует VotedByзначение VoteCount всегда выглядит как 0

Любая помощь будет оценена

CREATE PROCEDURE [dbo].[Votes]
    @VotedMember BIGINT,
    @VotedBy BIGINT

    AS
    DECLARE @votecount INT

    BEGIN TRY
    BEGIN TRANSACTION t_Transaction
    SELECT TOP 1 * FROM [GOTWVotes] WITH (TABLOCKX)

    SELECT @votecount = COUNT(*) FROM [dbo].[GOTWVotes] 
    WHERE [VotedBy] = @VotedBy
    IF @votecount = 0

    INSERT INTO 
        [dbo].[GOTWVotes] ([VotedMember],[VotedBy])
    VALUES
        (@VotedMember, @VotedBy)
    COMMIT TRANSACTION t_Transaction
    END TRY
    BEGIN CATCH
        SET @votecount = -1
        ROLLBACK TRANSACTION t_Transaction
    END CATCH
        RETURN @votecount

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Это кажется таким сложным. Я думаю что-то вроде этого:

CREATE PROCEDURE [dbo].[Votes] (
    @VotedMember BIGINT,
    @VotedBy BIGINT,
    @retval int output
) 
BEGIN

  INSERT INTO dbo.GOTWVotes (VotedMember, VotedBy)
    SELECT v.VotedMember, v.VotedBy
    FROM (VALUES (@VotedMember, @VotedBy)) v(VotedMember, VotedBy)
    WHERE NOT EXISTS (SELECT 1
                      FROM dbo.GOTWVotes gwv
                      WHERE gwv.VotedBy = v.VotedBy
                     );
  SET @retval = @@ROWCOUNT;
END;

Я подозреваю, что то, что вы хотите сделать, также может быть обработано с ограничениями.

0 голосов
/ 07 апреля 2019

Вы можете сделать следующий код

CREATE PROCEDURE [dbo].[Votes]
    @VotedMember BIGINT,
    @VotedBy BIGINT,
    @votecount INT OUTPUT

    AS

    BEGIN TRY
    BEGIN TRANSACTION t_Transaction

    SET @votecount = 0
    IF NOT EXISTS(SELECT 1 FROM [dbo].[GOTWVotes] 
    WHERE [VotedBy] = @VotedBy)
    BEGIN
        INSERT INTO 
        [dbo].[GOTWVotes] ([VotedMember],[VotedBy])
    VALUES
        (@VotedMember, @VotedBy)        
    END
    ELSE
    BEGIN
        SELECT @votecount = COUNT(*) FROM [dbo].[GOTWVotes] 
    WHERE [VotedBy] = @VotedBy
    END


    COMMIT TRANSACTION t_Transaction
    END TRY
    BEGIN CATCH
        SET @votecount = -1
        ROLLBACK TRANSACTION t_Transaction
    END CATCH

Для вызова выше хранимой процедуры вам необходимо написать следующий код

DECLARE @votecount int
EXEC dbo.Votes @VotedMember = 0, -- bigint
    @VotedBy = 0, -- bigint
    @votecount = @votecount OUTPUT -- int

SELECT @votecount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...