首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >存储过程临时表适用于不同的用户和生命周期

存储过程临时表适用于不同的用户和生命周期
EN

Stack Overflow用户
提问于 2018-05-21 03:38:58
回答 1查看 26关注 0票数 0

我有关于临时表的问题。我有一个如下所示的存储过程。我是否应该以某种方式删除我的临时表,或者一旦存储过程完成,它们就会自动删除(如果是这样的话,在什么地方这样做是正确的?)

第二个问题是:如果两个用户同时启动这个存储过程,他们是共享相同的临时表,还是每个用户的存储过程都有自己的临时表?

附注:如果我的存储过程中有什么可以调优的地方,请让我知道。

谢谢!

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-05-21 04:31:02

我在proc代码中看不到临时表,只有表变量。它们的作用域是声明它们的proc的局部作用域,并将在proc完成时自动销毁。它们仅在proc代码中可见。

另外,在进程中创建的本地临时表(#前缀)是会话的本地表,并将在进程完成时自动删除。这些在proc代码中以及从proc中调用的其他模块中都是可见的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50438715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档