在一个存储过程中创建两个临时表时是否有任何问题

时间:2011-12-29 09:48:38

标签: tsql

我写了下面的存储过程。我需要创建两个临时表。 在第一个临时表上我使用游标使用id,然后基于某些查询需要在第二个临时表中插入。但我得到以下错误。 。 在这种情况下我需要一些帮助

  

数据库中已有一个名为“TempTable”的对象。

ALTER PROCEDURE [dbo].[GetDocumentByTrackID]

@idList nvarchar(50)

AS
BEGIN

SET NOCOUNT ON;
DECLARE @TrackId INT

- 临时表1

CREATE TABLE TempTable(
ID INT
)

DECLARE @GetNextRecord cursor
INSERT INTO TempTable SELECT Value from dbo.fn_sqllist_to_table(@idList,';')

- 临时表2

Create TABLE TracksNameID
(
ID INT,
Name nvarchar(100)
)

SET @GetNextRecord = cursor for select ID from TempTable

open @GetNextRecord
FETCH FROM @GetNextRecord into @TrackId
while @@FETCH_STATUS = 0
BEGIN
INSERT INTO TracksNameID
SELECT  ID ,Name FROM  dbo.TestTable 
WHERE   dbo.TestTable.TrackID = @TrackId
END
FETCH FROM @GetNextRecord into @TrackId
DROP TABLE TempTable
END

2 个答案:

答案 0 :(得分:2)

这些实际上不是临时表,而是创建真正的表对象。如果存储过程在某处失败,则不会删除表。更好地坚持使用表变量:

DECLARE @tableName TABLE (
  id int, ... )

并像表一样使用@tableName(它是)。这样,所有内容都将绑定到存储过程的本地范围。

表变量相对于临时表的缺点是缺少聚簇索引而你不能ALTER表变量。

答案 1 :(得分:1)

您创建常规表,临时表名称应以#

开头

尝试创建#TempTable和#TracksNameID