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

#sql #transactions

#sql #транзакции

Вопрос:

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

Диаграмма

Также у меня объявлен пользовательский тип данных:

 create type TagList as table
(
    TagName varchar(255)
)
  

Теперь я просто попытался передать эту таблицу в качестве переменной в мою хранимую процедуру, чтобы проверить, работает ли она, однако, когда я выполняю следующую транзакцию, она выполняется столько раз, пока не достигнет предела транзакции

 ALTER PROCEDURE NewBlogPost
    @headline VARCHAR(255),
    @content VARCHAR(MAX),
    @userId INT,
    @categoryId INT,
    @tagId INT,
    @tags AS dbo.TagList READONLY
AS
BEGIN TRY
    BEGIN TRANSACTION
        DECLARE @postId INT

        SELECT @postId = (SELECT TOP 1 PostId
                          FROM Posts
                          ORDER BY PostId DESC)   1;

        INSERT INTO Posts (PostId, Headline, Content, UserId, CategoryId, StateId, PostedDate, LastEdit)
        VALUES (@postId, @headline, @content, @userId, @categoryId, 1, GETDATE(), GETDATE())

        INSERT INTO TagPost (PostId, TagId)
        VALUES (@postId, @tagId)

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        SELECT
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_LINE() AS ErrorLine,
            ERROR_MESSAGE() AS ErrorMessage

        ROLLBACK TRANSACTION
    END CATCH

DECLARE @TagTable TagList

INSERT INTO @TagTable(TagName)
VALUES ('Computers'), ('MobilePhones'), ('Pesos')

EXEC NewBlogPost @headline = 'Framework called VUE breaks new record', @content = 'New framework had broken world record in daily download', @userId = 1, @categoryId = 1, @tagId = 1, @tags = @TagTable
  

Есть идеи, почему я выполняю эту транзакцию так много раз?

Комментарии:

1. Какую СУБД вы используете? (Этот код зависит от продукта.)

2. DataGrip, но я получил те же результаты, выполнив это в MSSQL Studio

Ответ №1:

Хорошо, я понял это, это не имеет никакого отношения к транзакции, я случайно вставил инструкцию exec в транзакцию, поэтому я создал бесконечный цикл.