我有关于临时表的问题。我有一个如下所示的存储过程。我是否应该以某种方式删除我的临时表,或者一旦存储过程完成,它们就会自动删除(如果是这样的话,在什么地方这样做是正确的?)
第二个问题是:如果两个用户同时启动这个存储过程,他们是共享相同的临时表,还是每个用户的存储过程都有自己的临时表?
附注:如果我的存储过程中有什么可以调优的地方,请让我知道。
谢谢!
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发布于 2018-05-21 04:31:02
我在proc代码中看不到临时表,只有表变量。它们的作用域是声明它们的proc的局部作用域,并将在proc完成时自动销毁。它们仅在proc代码中可见。
另外,在进程中创建的本地临时表(#前缀)是会话的本地表,并将在进程完成时自动删除。这些在proc代码中以及从proc中调用的其他模块中都是可见的。
https://stackoverflow.com/questions/50438715
复制相似问题