Временные таблицы хранимых процедур варьируются между разными пользователями и временем жизни - PullRequest
0 голосов
/ 20 мая 2018

У меня вопрос по временным таблицам.У меня есть хранимая процедура, как показано ниже.Должен ли я каким-то образом удалить свои временные таблицы или они будут удалены автоматически после завершения хранимой процедуры (если так, что было бы правильным для этого способом?)

Второй вопрос: если два пользователя запустят эту хранимую процедурув то же время, будут ли они использовать одни и те же временные таблицы, или хранимая процедура каждого пользователя будет иметь свою собственную временную таблицу?

PS Если есть что-то, что можно настроить в моей хранимой процедуре, дайте мне знать, кроме.

Спасибо!

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Test]
    @Level INT,
    @KatSubkatId INT,   
    @WordId INT,
    @SubsubkatId INT = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @temp_T_Html_Word_Categories TABLE(Id INT)
    DECLARE @temp_T_Html_WordCat_Phrase TABLE(FK_Phrase_ID INT)

    IF (@Level = 2)
        BEGIN
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId
        END
    ELSE IF (@Level = 3)
        BEGIN
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID IS NULL;
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID = @SubsubkatId;
        END
    ELSE
        BEGIN
            SELECT null;
            RETURN;
        END

        print 'I am here'

    INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId

    --DECLARE @v XML = (SELECT * FROM @temp_T_Html_Word_Categories FOR XML AUTO)

    Declare @Id int;
    --it makes no difference what you SELECT in an EXISTS sub-query as it is just syntactical sugar. (ie Nothing is actually selected.) SELECT * or SELECT 1 ...
    WHILE EXISTS(SELECT * FROM @temp_T_Html_Word_Categories)        
    BEGIN
        Select Top 1 @Id = Id From @temp_T_Html_Word_Categories;

    INSERT INTO @temp_T_Html_WordCat_Phrase(FK_Phrase_ID) SELECT FK_Phrase_ID FROM T_Html_WordCat_Phrase WHERE FK_Word_Categorie_ID = @Id;
        Delete @temp_T_Html_Word_Categories Where Id = @Id;     
    END;

    --IF EXISTS (SELECT * FROM T_Html_Phrase WHERE Id NOT IN (SELECT FK_Phrase_ID FROM @temp_T_Html_WordCat_Phrase))
    --  SET @IddD = 1;
    --ELSE
    --  SET @IddD = 0;


    SELECT * FROM T_Html_Phrase WHERE Id NOT IN (SELECT FK_Phrase_ID FROM @temp_T_Html_WordCat_Phrase)

    --DECLARE @b XML = (SELECT * FROM T_Html_Phrase FOR XML AUTO)

    Delete @temp_T_Html_WordCat_Phrase;

END

1 Ответ

0 голосов
/ 20 мая 2018

Я не вижу временных таблиц в вашем коде процесса, только табличные переменные.Они имеют локальную область действия для процедуры, в которой они объявлены, и будут автоматически уничтожены после завершения процедуры.Они видны только в коде proc.

Отдельно локальные временные таблицы (префикс #), созданные в proc, являются локальными для сеанса и будут автоматически отброшены после завершения proc.Они видны в коде proc, а также в других модулях, вызываемых из proc.

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